rt,数据范围 50 万,求调
#include<bits/stdc++.h>
using namespace std;
vector<long long>e[500006];
long long fa[500006],dep[500006],siz[500006],son[500006],v[500006],f[500006];
void dfs(long long u,long long father){
long long lz;
f[u]=v[u];
fa[u]=father;
dep[u]=dep[father]+1;
siz[u]=1;
lz=e[u].size();
for(long long i=0;i<lz;i++){
if(e[u][i]==father)continue;
dfs(e[u][i],u);
siz[u]+=siz[e[u][i]];
if(siz[son[u]]<siz[e[u][i]])son[u]=e[u][i];
f[u]+=max(0ll,f[e[u][i]]);
}
return;
}
long long dfn[500006],nidfn[500006],top[500006],tot;
void pf(long long u,long long father){
long long lz;
dfn[u]=++tot;
nidfn[tot]=u;
if(son[u]){
top[son[u]]=top[u];
pf(son[u],u);
}
lz=e[u].size();
for(long long i=0;i<lz;i++){
if(e[u][i]==father)continue;
if(e[u][i]==son[u])continue;
top[e[u][i]]=e[u][i];
pf(e[u][i],u);
}
return;
}
long long lowbit(long long x){
return x&(-x);
}
struct st{
long long c[500006];
void add(long long x,long long y){
for(long long i=x;i<=y;i+=lowbit(i))c[i]+=y;
return;
}
void add(long long x,long long y,long long z){
for(long long i=x;i<=y;i++)add(i,z);
return;
}
long long query(long long x){
long long r=0;
for(long long i=x;i;i-=lowbit(i))r+=c[i];
return r;
}
long long query(long long x,long long y){
return query(y)-query(x-1);
}
}tr;
void update(long long x,long long y,long long z){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
tr.add(dfn[top[x]],dfn[x],z);
x=fa[top[x]];
}
else{
tr.add(dfn[top[y]],dfn[y],z);
y=fa[top[y]];
}
}
if(dep[x]>dep[y])tr.add(dfn[y],dfn[x],z);
else tr.add(dfn[x],dfn[y],z);
return;
}
long long qry(long long x,long long y){
long long r=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]){
r+=tr.query(dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
else{
r+=tr.query(dfn[top[y]],dfn[y]);
y=fa[top[y]];
}
}
if(dep[x]>dep[y])r+=tr.query(dfn[y],dfn[x]);
else r+=tr.query(dfn[x],dfn[y]);
return r;
}
long long n,q,x,y,pre;
int main(){
scanf("%lld %lld",&n,&q);
for(long long i=1ll;i<=n;i++){
scanf("%lld",&v[i]);
tr.add(i,v[i]);
}
for(long long i=2ll;i<=n;i++){
scanf("%lld",&fa[i]);
e[fa[i]].push_back(i);
}
dfs(1,0);
top[1]=1;
pf(1,0);
for(long long i=1;i<=q;i++){
scanf("%lld %lld",&x,&y);
v[x]+=y;
tr.add(x,y);
f[x]+=y;
pre=x;
for(long long ii=fa[x];ii!=0;pre=ii,ii=fa[ii]){
if(f[pre]<=0)break;
f[ii]+=y;
}
printf("%lld\n",f[x]);
}
return 0ll;
}