同上,区间更新,单点查询。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<string>
#define eps 1e-12
#define INF 0x7fffffff
#define maxn 100010
using namespace std;
#pragma comment(linker,"/STACk:10240000,10240000")
struct node
{
int to,next;
} e[maxn<<1];
int head[maxn],en,n;
int fa[maxn],siz[maxn],top[maxn],son[maxn],w[maxn],dep[maxn],id;
int num[maxn<<2];
int col[maxn<<2];
void init()
{
fa[1]=0;
dep[1]=0;
id=en=0;
memset(head,-1,sizeof(head));
memset(siz,0,sizeof(siz));
memset(num,0,sizeof(num));
memset(col,0,sizeof(col));
}
void add(int a,int b)
{
e[en].to=b;
e[en].next=head[a];
head[a]=en++;
}
void dfs(int now)
{
siz[now]=1;
son[now]=0;
for(int i=head[now]; ~i; i=e[i].next)
{
int to=e[i].to;
if(to!=fa[now])
{
fa[to]=now;
dep[to]=dep[now]+1;
dfs(to);
if(siz[to]>siz[son[now]]) son[now]=to;
siz[now]+=siz[to];
}
}
}
void getid(int now,int root)
{
w[now]=++id;
top[now]=root;
if(son[now]) getid(son[now],top[now]);
for(int i=head[now]; ~i; i=e[i].next)
{
if(e[i].to!=son[now]&&e[i].to!=fa[now])
{
getid(e[i].to,e[i].to);
}
}
}
void pushdown(int rt)
{
if(col[rt])
{
num[rt<<1]+=col[rt];
num[rt<<1|1]+=col[rt];
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
col[rt]=0;
}
}
void update(int rt,int l,int r,int ql,int qr,int add)
{
if(ql<=l&&r<=qr)
{
num[rt]+=add;
col[rt]+=add;
return ;
}
int mid=(l+r)/2,lson=(rt<<1),rson=(rt<<1|1);
// pushdown(rt);
if(ql<=mid) update(lson,l,mid,ql,qr,add);
if(qr>mid) update(rson,mid+1,r,ql,qr,add);
}
int querysum(int rt,int l,int r,int k)
{
if(l==r) return num[rt];
int mid=(l+r)/2,lson=(rt<<1),rson=(rt<<1|1);
pushdown(rt);
if(k<=mid) return querysum(lson,l,mid,k);
else return querysum(rson,mid+1,r,k);
}
void change(int x,int y,int val)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
update(1,1,n,w[top[x]],w[x],val);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
update(1,1,n,w[x],w[y],val);
}
int save[maxn];
int main()
{
char str[5];
int a,b,c,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
init();
for(int i=1; i<=n; i++)
{
scanf("%d",&save[i]);
}
for(int i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1);
getid(1,1);
for(int i=1; i<=n; i++)
{
update(1,1,n,w[i],w[i],save[i]);
}
while(k--)
{
scanf("%s",str);
if(str[0]=='Q')
{
scanf("%d",&a);
printf("%d\n",querysum(1,1,n,w[a]));
}
else if(str[0]=='D')
{
scanf("%d%d%d",&a,&b,&c);
change(a,b,-c);
}
else
{
scanf("%d%d%d",&a,&b,&c);
change(a,b,c);
}
}
}
return 0;
}