不知道为什么全都WA掉了,十分神奇
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
int slen=0;char c,buf[22];bool f;
template <typename T>
inline void rd(T &x)
{
x=0;f=0;c=getchar();
while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
if(f) x=-x;
}
template <typename T>
inline void wt(T x)
{
if(!x) putchar('0');if(x<0) putchar('-'),x=-x;
while(x) buf[++slen]=x%10+48,x/=10;
while(slen) putchar(buf[slen--]);
}
}
using IO::rd;
using IO::wt;
const int N=100005,M=200005;
typedef long long ll;
int n,m,ver[M],nxt[M],h[N],fl[M],tot,ind,tid[N],tif[N],val[M];
ll a[N],tr[M<<2],tag[M<<2],sum[M];
inline void add(int x,int y) {ver[++tot]=y,nxt[tot]=h[x],h[x]=tot;}
void dfs(int u,int fa)
{
tid[u]=++ind;
val[ind]=a[u];
fl[ind]=1;
for(int i=h[u];i;i=nxt[i])
if(ver[i]!=fa) dfs(ver[i],u);
tif[u]=++ind;
val[ind]=-a[u];
fl[ind]=-1;
}
void build(int p,int l,int r)
{
if(l==r)
{
tr[p]=val[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
tr[p]=tr[p<<1]+tr[p<<1|1];
}
inline void push_down(int p,int l,int mid,int r)
{
if(tag[p])
{
tr[p<<1]+=tag[p]*(sum[mid]-sum[l-1]);
tr[p<<1|1]+=tag[p]*(sum[r]-sum[mid]);
tag[p<<1]+=tag[p];
tag[p<<1|1]+=tag[p];
tag[p]=0;
}
}
void modify(int p,int l,int r,int x,int y,ll z)
{
if(l>=x && r<=y)
{
tr[p]+=z*(sum[r]-sum[l-1]);
tag[p]+=z;
return;
}
int mid=(l+r)>>1;
push_down(p,l,mid,r);
if(mid>=x) modify(p<<1,l,mid,x,y,z);
if(mid<y) modify(p<<1|1,mid+1,r,x,y,z);
tr[p]=tr[p<<1]+tr[p<<1|1];
}
ll query(int p,int l,int r,int x,int y)
{
if(l>=x && r<=y) return tr[p];
int mid=(l+r)>>1;ll res=0;
push_down(p,l,mid,r);
if(mid>=x) res+=query(p<<1,l,mid,x,y);
if(mid<y) res+=query(p<<1|1,mid+1,r,x,y);
return res;
}
int main()
{
rd(n),rd(m);
for(int i=1;i<=n;i++) rd(a[i]);
for(int i=1,x,y;i<n;i++)
{
rd(x),rd(y);
add(x,y),add(y,x);
}
dfs(1,0);
for(int i=1;i<=2*n;i++)
sum[i]=sum[i-1]+fl[i];
build(1,1,2*n);
while(m--)
{
int op,x,z;
rd(op);
if(op==1)
{
rd(x),rd(z);
modify(1,1,2*n,tid[x],tid[x],z);
modify(1,1,2*n,tif[x],tif[x],-z);
}
else if(op==2)
{
rd(x),rd(z);
modify(1,1,2*n,tid[x],tif[x],z);
}
else
{
rd(x);
wt(query(1,1,2*n,1,tid[x])),putchar('\n');
}
}
return 0;
}