holiday/8.10/C - Aragorn's Story.cpp

158 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=3e4+1,N2=N<<1,inf=0x3f3f3f3f;//N2 双向边记得*2
int to[N2],h[N2],ne[N2];
int nid[N],oid[N],top[N],w[N],dep[N],fa[N];
int siz[N],son[N];//子树节点数重边儿子siz最大的儿子
int a[N<<2];
int t,u,v,w1,qu,n,m,cnt=0;
char opt;
#define ls rt<<1
#define rs rt<<1|1
#define mid ((l+r)>>1) //>>1写成>>2
#define lson ls,l,mid //l写成1
#define rson rs,mid+1,r
#define len (r-l+1)
void add(int u,int v)
{
to[++cnt]=v;
ne[cnt]=h[u];
h[u]=cnt;
}
//以下是线段树
int tot=0;
void build(int rt,int l,int r)
{
if(l==r)
{
a[rt]=w[oid[l]];
// printf("l:%d,qm[%d]=w[%d]=%d\n",l,rt,oid[l],qm[rt]);
return;
}
// if(rt<=mid)
build(ls,l,mid);
// else
build(rs,mid+1,r);
// printf("a[%d]=a[%d]%d/a[%d]%d\n",rt,ls,qm[ls],rs,qm[rs]);
}
inline void pushdown(int rt)
{
a[ls]+=a[rt];
a[rs]+=a[rt];
a[rt]=0;
}
inline int q(int rt,int l,int r,int u)
{
if(l==r)
{
// printf("[%d]",rt);
return a[rt];
}
pushdown(rt);
int res=0;
if(u<=mid)res=q(lson,u);
if(u>mid)res=q(rson,u);
return res;
}
//以上是线段树
inline void dfs1(int u,int f,int deep)
{
fa[u]=f;
dep[u]=deep;
siz[u]=1;
for(int i=h[u]; i; i=ne[i])
{
int v=to[i];//bug int
if(v==f) continue;//bug 放后了
// printf("(wo[%d]=val[%d]=%d)\n",v,i,val[i]);
dfs1(v,u,deep+1);
siz[u]+=siz[v];
if(son[u]==0||siz[v]>siz[son[u]])
{
son[u]=v;
}
}
// printf("out:%d:fa:%d,dep:%d,siz:%d\n",u,f,deep,siz[u]);
}
inline void dfs2(int u,int tp)
{
nid[u]=++cnt;
oid[cnt]=u;
top[u]=tp;
// printf("%d:nid:%d,nw:%d,top:%d\n",u,cnt,wo[u],topf);
if(!son[u]) return;
dfs2(son[u],tp);
for(int i=h[u]; i; i=ne[i])
{
v=to[i];
if(v!=fa[u]&&v!=son[u])
{
dfs2(v,v);
}
}
}
inline void change(int L,int R,int w1,int rt,int l,int r)
{
if(L<=l&&r<=R)
{
a[rt]+=w1;
// printf("u:%d,a[%d]=%d(l=r=%d)\n",u,rt,w1,l);
}
else
{
if(u<=mid)
{
change(L,R,w1,lson);
}
else change(L,R,w1,rson);
// printf("u:%d,a[%d]=a[%d]%d/a[%d]%d\n",u,rt,ls,a[ls],rs,a[rs]);
}
}
int main()
{
scanf("%d%d%d",&n,&m,&qu);
cnt=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&w[i]);
}
for(int i=1; i<=m; i++)
{
scanf("%d%d",&u,&v);// 多打一个%d c0000005 APPCRASH
// printf("(%d)",i);
add(u,v);
add(v,u);
}
dfs1(1,0,1);
cnt=0;
dfs2(1,1);
build(1,1,cnt);
printf("(%d)",qu);
while(qu--)
{
scanf("%c",&opt);//"&"
if(opt=='I')
{
scanf("%d%d%d",&u,&v,&w1);//%d,加了变量没加%d
change(nid[u],nid[v],w1,1,1,cnt);
}
else if(opt=='D')
{
scanf("%d%d%d",&u,&v,&w1);
change(nid[u],nid[v],w1*-1,1,1,cnt);
}
else
{
scanf("%d",&u);
printf("%d\n",q(1,1,n,u));
}
}
return 0;
}