#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<bitset>
#include<vector>
#include<algorithm>
#include<iostream>
#include<deque>
using namespace std;
namespace mine
{
typedef long long ll;
const int INF=0x3f3f3f3f;
ll ()
{
ll ans=0;char c=getchar();int f=1;
while(c<'0' or c>'9') {if(c=='-') f=-1;c=getchar();}
while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
return ans*f;
}
void write(int num)
{
if(num<0) {num=-num;putchar('-');}
if(num>9) write(num/10);
putchar('0'+num%10);
}
void writeln(int num){write(num);puts(大专栏 【51nod1462】树据结构span class="string">"");}
#define pr pair<int,int>
#define FR first
#define SE second
#define MP make_pair
inline void chmin(ll &x,ll y) {x=x<y?x:y;}
const int MAX_N=110000;
vector<int> son[MAX_N];
int id=0;
void insert(ll s[],int lc[],int rc[],int &x,int l,int r,int p,ll c)
{
if(x==0) x=++id;
s[x]+=c;
if(l==r) return;
int mid=(l+r)>>1;
if(p<=mid) insert(s,lc,rc,lc[x],l,mid,p,c);
else insert(s,lc,rc,rc[x],mid+1,r,p,c);
}
void merg(ll s[],int lc[],int rc[],int x,int &y,int l,int r)
{
if(x==0) return;
if(y==0) {y=x;return;}
s[y]+=s[x];
if(l==r) return;
int mid=(l+r)>>1;
merg(s,lc,rc,lc[x],lc[y],l,mid);
merg(s,lc,rc,rc[x],rc[y],mid+1,r);
}
ll s[2][MAX_N*20];
int rt[2][MAX_N],lc[2][MAX_N*20],rc[2][MAX_N*20];
ll ans[MAX_N];
void calc(ll &sum,int x,int y,int l,int r)
{
if(x==0 or y==0) return;
sum+=s[0][lc[0][x]]*s[1][rc[1][y]];
if(l==r) return;
int mid=(l+r)>>1;
calc(sum,lc[0][x],lc[1][y],l,mid);
calc(sum,rc[0][x],rc[1][y],mid+1,r);
}
int q;
void solve(int x)
{
calc(ans[x],rt[0][x],rt[1][x],1,q);
for(int t=0;t<(int)son[x].size();t++)
{
int y=son[x][t];
solve(y);
ans[x]+=ans[y];
calc(ans[x],rt[0][x],rt[1][y],1,q);
calc(ans[x],rt[0][y],rt[1][x],1,q);
merg(s[0],lc[0],rc[0],rt[0][y],rt[0][x],1,q);
merg(s[1],lc[1],rc[1],rt[1][y],rt[1][x],1,q);
}
}
void main()
{
int n;scanf("%d",&n);
for(int i=2;i<=n;i++) son[qread()].push_back(i);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int op=qread(),x=qread();ll d=qread();
if(op==1) insert(s[0],lc[0],rc[0],rt[0][x],1,q,i,d);
else insert(s[1],lc[1],rc[1],rt[1][x],1,q,i,d);
}
memset(ans,0,sizeof ans);
solve(1);
for(int i=1;i<=n;i++) printf("%lldn",ans[i]);
}
};
int main()
{
srand(time(0));
mine::main();
}
|