提交时间:2024-07-30 14:10:28
运行 ID: 30769
#include<bits/stdc++.h> using namespace std; long long mod=1e9+7; long long n,m; struct sss{ long long deep,t,fa,c,a[10003],b[10003]; }tr[10003]; void c0(long long i,long long a,long long b,long long now){ if(now<=0)return; for(int j=1;j<=n;j++){ if(tr[j].fa!=now)continue; long long d=tr[j].deep-tr[i].deep; tr[j].t-=pow(-1,d)*(a+b*d); tr[j].t=(tr[j].t+mod)%mod; c0(i,a,b,j); } } void c3(long long i){ while(tr[i].c>0){ c0(i,tr[i].a[tr[i].c],tr[i].b[tr[i].c],i); tr[i].c--; } for(int j=1;j<=n;j++){ if(tr[j].fa==i){ c3(j); } } } void c1(long long i,long long a,long long b,long long now){ if(now<=0)return; for(int j=1;j<=n;j++){ if(tr[j].fa!=now)continue; long long d=tr[j].deep-tr[i].deep; tr[j].t+=pow(-1,d)*(a+b*d); tr[j].t=(tr[j].t+mod)%mod; c1(i,a,b,j); } } int main(){ tr[1].deep=1; tr[1].t=0; tr[1].c=0; scanf("%lld%lld",&n,&m); for(int i=2;i<=n;i++){ long long tt; scanf("%lld",&tt); tr[i].deep=tr[tt].deep+1; tr[i].fa=tt; tr[i].t=0; tr[i].c=0; } while(m--){ long long op; scanf("%lld",&op); if(op==1){ long long x,a,b; scanf("%lld%lld%lld",&x,&a,&b); c1(x,a,b,x); tr[x].c++; tr[x].a[tr[x].c]=a; tr[x].b[tr[x].c]=b; tr[x].t+=a; } if(op==2){ long long x; scanf("%lld",&x); printf("%lld\n",tr[x].t); } else if(op==3){ long long x; scanf("%lld",&x); c3(x); } } return 0; }