#include #include #include #include #include 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; }