求调,玄关,WA 4,5,7.
#include <bits/stdc++.h>
#define cin std::cin
#define cout std::cout
const int N=5e5+5;
std::vector<int>g[N];
int fa[N],son[N],siz[N],id[N];
int w[N],wt[N],n,m;
int cnt,rt=1;
int tree[N<<2],lazy[N<<2];
#define lx (x<<1)
#define rx (x<<1|1)
#define mid (L+R>>1)
void up(int x){tree[x]=tree[lx]+tree[rx];}
void down(int x,int L,int R){if(lazy[x]){lazy[lx]+=lazy[x];lazy[rx]+=lazy[x];tree[lx]+=lazy[x]*(mid-L+1);tree[rx]+=lazy[x]*(R-mid);lazy[x]=0;}}
void build(int x,int L,int R)
{
if(L==R){tree[x]=w[wt[L]];return;}
build(lx,L,mid);
build(rx,mid+1,R);
up(x);
}
void update(int x,int L,int R,int l,int r,int k)
{
if(l<=L&&R<=r){tree[x]+=k*(R-L+1);lazy[x]+=k;return;}
down(x,L,R);
if(l<=mid)update(lx,L,mid,l,r,k);
if(r>mid)update(rx,mid+1,R,l,r,k);
up(x);
}
int query(int x,int L,int R,int k)
{
if(L==R)return tree[x];
down(x,L,R);
int ans;
if(mid>=k)ans=query(lx,L,mid,k);
else ans=query(rx,mid+1,R,k);
return ans;
}
void dfs1(int x,int f)
{
fa[x]=f;
siz[x]=1;
for(register int i=0;i<g[x].size();++i)
{
int v=g[x][i];
if(v==f)continue;
dfs1(v,x);
siz[x]+=siz[v];
if(siz[son[x]]<siz[v])son[x]=v;
}
}
void dfs2(int x,int topf)
{
id[x]=++cnt;
wt[cnt]=x;
if(!son[x])return;
dfs2(son[x],topf);
for(register int i=0;i<g[x].size();++i)
{
int v=g[x][i];
if(v==fa[x]||v==son[x])continue;
dfs2(v,v);
}
}
signed main()
{
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m>>w[1];
for(register int i=2;i<=n;++i)
{
int f;
cin>>w[i]>>f;
g[f].push_back(i);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
while(m--)
{
char c;
int x,y;
cin>>c>>x;
if(c=='p')cin>>y,update(1,1,n,id[x]+1,id[x]+siz[x]-1,y);
if(c=='u')cout<<query(1,1,n,id[x])<<'\n';
}
}