RT
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e5+5;
ll fir[N],nxt[N<<1],to[N<<1],val[N],sum[N<<2],ect=0;
ll fa[N],dep[N],sze[N],son[N],top[N],seg[N],rev[N];
inline void addedge(int u1,int v1)
{
nxt[++ect]=fir[u1];fir[u1]=ect;to[ect]=v1;
}
int total=0;
inline void dfs1(int u,int f)
{
dep[u]=dep[f]+1;
sze[u]=1;fa[u]=f;
//total++;
//if(total>50000) exit(0);
for(int i=fir[u];i;i=nxt[i])
{
int v=to[i];
if(v==f) continue;
dfs1(v,u);
sze[u]+=sze[v];
if(sze[v]>sze[son[u]]) son[u]=v;
}
}
inline void dfs2(int u,int f)
{
if(son[u])
{
seg[son[u]]=++seg[0];
rev[seg[son[u]]]=son[u];
top[son[u]]=top[u];
dfs2(son[u],u);
}
for(int i=fir[u];i;i=nxt[i])
{
int v=to[i];
if(top[v]) continue;
seg[v]=++seg[0];
rev[seg[v]]=v;
top[v]=v;
dfs2(v,u);
}
}
ll add[N<<2];
inline void build(int k,int l,int r)
{
if(l==r)
{
sum[k]=val[rev[l]];
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
inline void Add(int k,int l,int r,int v)
{
add[k]+=v;
sum[k]+=(r-l+1)*v;
}
inline void pushdown(int k,int l,int r,int mid)
{
if(add[k]==0) return;
Add(k<<1,l,mid,add[k]);
Add(k<<1|1,mid+1,r,add[k]);
add[k]=0;
}
inline void change(int k,int l,int r,int x,int y,int v)
{
if(l>y||r<x) return;
if(x<=l&&r<=y)
{
Add(k,l,r,v);
return;
}
int mid=l+r>>1;
pushdown(k,l,r,mid);
change(k<<1,l,mid,x,y,v);
change(k<<1|1,mid+1,r,x,y,v);
sum[k]=sum[k<<1]+sum[k<<1|1];
}
inline ll query(int k,int l,int r,int x,int y)
{
if(l>y||r<x) return 0ll;
if(x<=l&&r<=y) return sum[k];
int mid=l+r>>1;
pushdown(k,l,r,mid);
return query(k<<1,l,mid,x,y)+query(k<<1|1,mid+1,r,x,y);
}
ll n,m;
int main()
{
// freopen("P3178_2.in","r",stdin);
// freopen("p3178.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&val[i]);
for(int i=1;i<n;i++)
{
int t1,t2;
scanf("%lld%lld",&t1,&t2);
addedge(t1,t2);addedge(t2,t1);
}
dfs1(1,0);
exit(0);
seg[0]=seg[1]=rev[1]=top[1]=1;
dfs2(1,0);
build(1,1,seg[0]);
for(int i=1;i<=m;i++)
{
int opt,x;ll a;
scanf("%lld%lld",&opt,&x);
if(opt==1)
{
scanf("%lld",&a);
change(1,1,seg[0],seg[x],seg[x],a);
}
else if(opt==2)
{
scanf("%lld",&a);
// while(fx!=1)
// {
// change(1,1,seg[0],seg[fx],seg[x],a);
// x=fa[fx];fx=top[x];
// }
// change(1,1,seg[0],seg[1],seg[x],a);
//
change(1,1,seg[0],seg[x],seg[x]+sze[x]-1,a);
}
else
{
int fx=top[x];
ll res=0;
while(fx!=1)
{
res+=query(1,1,seg[0],seg[fx],seg[x]);
x=fa[fx];fx=top[x];
}
res+=query(1,1,seg[0],seg[1],seg[x]);
printf("%lld\n",res);
}
}
}
限制 dfs 次数在50000以内,第二组数据在本地上还是爆系统栈了(在机房打欧拉回路时也这样,现在的系统栈容量是1吗)