记录编号 351467 评测结果 AAAAAAAAAA
题目名称 新型武器 最终得分 100
用户昵称 GravatarRiolu 是否通过 通过
代码语言 C++ 运行时间 1.378 s
提交时间 2016-11-16 16:25:37 内存使用 7.74 MiB
显示代码纯文本
/*=========================================*
  * Auther: Riolu
  * Time: 2016.11.16
  * ©Copyright 2016 Riolu. All Rights Reserved.
  *=========================================*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
//#include<cmath>
#include<string>
#include<cstring>
using namespace std;

typedef pair<int,int> P;
typedef long long ll;
typedef double db;
const int N =3e5+1;
int n,k;
//v 每个点的权,b bfs序列,df dfs序列,deth bfs序列中点的深度,posb 在b中的位置,de每个点的深度,
int v[N],b[N],df[N],deth[N],posb[N],posf[N],de[N];
vector<int> son[N];
int sd[N];//第一个深度出现位置
int head,end,num;
int Q(int rt,int c){
	int ans=0,i,l=son[rt].size();
	if(c==0)return v[rt];
	//cout<<de[rt]<<endl;
	//cout<<de[rt]+c<<endl;
	int frontd=sd[de[rt]+c],endd=sd[de[rt]+c+1]-1;
	int pos1=posf[rt],pos2=posf[b[posb[rt]+1]];
	if(deth[posb[rt]+1]!=de[rt])pos2=n+1;
	//cout<<frontd<<' '<<endd<<' '<<pos1<<' '<<pos2<<endl;
	for(i=frontd;i<=endd;i++){
		if(pos1<posf[b[i]]&&posf[b[i]]<pos2)
			ans+=v[b[i]];
	}
	return ans;
}
void bfs(){
	head=end=1;b[end++]=1;posb[1]=1;deth[1]=1;
	int t,i,j,l;
	while(head<end){
		t=b[head++];l=son[t].size();
		for(i=0;i<l;i++){
			deth[end]=de[son[t][i]];
			b[end]=son[t][i];
			posb[son[t][i]]=end++;
		}
	}
	//for(i=1;i<end;i++)cout<<b[i]<<' ';cout<<endl;
	//for(i=1;i<end;i++)cout<<posb[i]<<' ';cout<<endl;
	//for(i=1;i<end;i++)cout<<de[i]<<' ';cout<<endl;
}
void dfsf(int pos,int y){
	df[++num]=pos;posf[pos]=num;de[pos]=y;
	int i,l=son[pos].size();
	for(i=0;i<l;i++)dfsf(son[pos][i],y+1);
}
int read(){
	freopen("newweapon.in","r",stdin);
	freopen("newweapon.out","w",stdout);
	scanf("%d",&n);
	int i,fa,to,t,t1,t2;
	for(i=1;i<=n;i++)scanf("%d",&v[i]);
	for(i=1;i<n;i++){
		scanf("%d%d",&fa,&to);
		son[fa].push_back(to);
		}
	dfsf(1,1);
	bfs();
	sd[deth[n]+1]=n+1;
	for(i=end-1;i>=1;i--)sd[deth[i]]=i;
	//for(i=1;i<=6;i++)cout<<sd[i]<<' ';cout<<endl;
	//for(i=1;i<end;i++)cout<<df[i]<<' ';cout<<endl;
	//for(i=1;i<end;i++)cout<<posf[i]<<' ';cout<<endl;
	scanf("%d",&k);
	for(i=1;i<=k;i++){
		scanf("%d%d%d",&t,&t1,&t2);
		if(t==1)v[t1]=t2;
		else printf("%d\n",Q(t1,t2));
	}
	fclose(stdin);fclose(stdout);
}int R=read();int main(){;}