记录编号 458716 评测结果 AAAAAAAAAA
题目名称 新型武器 最终得分 100
用户昵称 Gravatarnfy_2002 是否通过 通过
代码语言 C++ 运行时间 1.738 s
提交时间 2017-10-11 19:29:08 内存使用 24.35 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define RG register
#define IL inline
#define pi acos(-1.0)
#define ll long long
#define lson o*2
#define rson o*2+1
using namespace std;

struct date{
	int first,nxt,to;
};
date a[700000];
int num,n,q,ans=0;
int w[300005];
int b[300005];//bfs序列构成的
int bfn[300005],dfn[300005];
int bf=0,df=0;
int size[300005],deep[300005];
int tree[1500000];
int s[300005];
int beg[300005],en[300005];

void add(int l,int r){
	a[++num].to=r;
	a[num].nxt=a[l].first;
	a[l].first=num;
}

void bfs(){
	memset(deep,-1,sizeof(deep));
  int head=0,tail=1;
	s[tail]=1;
	deep[1]=0;
	bfn[1]=++bf;
	b[1]=1;
	beg[0]=en[0]=1;
	while(head<=tail){
		++head;
		int u=s[head];
		for(int i=a[u].first;i;i=a[i].nxt){
			int v=a[i].to;
			if(deep[v]==-1){
				 deep[v]=deep[u]+1;
				 bfn[v]=++bf;
				 b[bf]=v;
				 s[++tail]=v;
				 if(!beg[deep[v]]) beg[deep[v]]=bf;
				 en[deep[v]]=bf;
			}
		}
	}
}

void dfs(int u,int fa){
	size[u]=1;
	dfn[u]=++df;
	for(int i=a[u].first;i;i=a[i].nxt){
		int v=a[i].to;
		if(v==fa) continue;
		else{
			dfs(v,u);
			size[u]+=size[v];
		}
	}
}

void build(int l,int r,int o){
	if(l==r){
		tree[o]=w[b[l]];
		return;
	}
	int mid=(l+r)/2;
	if(l<=mid) build(l,mid,lson);
	if(r>mid) build(mid+1,r,rson);
	tree[o]=tree[lson]+tree[rson];
}

void update(int l,int r,int x,int zhi,int o){
	if(l==r){
		 tree[o]=zhi;
		 return;
	}
	int mid=(l+r)/2;
	if(x<=mid) update(l,mid,x,zhi,lson);
	else update(mid+1,r,x,zhi,rson);
	tree[o]=tree[lson]+tree[rson];
}

void ques(int l,int r,int L,int R,int o){
	if(l>=L&&r<=R){
		ans+=tree[o];
		return;
	}
	int mid=(l+r)/2;
	if(L<=mid) ques(l,mid,L,R,lson);
	if(R>mid) ques(mid+1,r,L,R,rson);
}

int pre(int l,int r,int x){
	int ans=0;
	while(l<=r){
		int mid=(l+r)/2;
		if(dfn[b[mid]]<x) l=mid+1;
		else ans=mid,r=mid-1;
	}
	return ans;
}

int low(int l,int r,int x){
	int ans=0;
	while(l<=r){
		 int mid=(l+r)/2;
		 if(dfn[b[mid]]<=x) ans=mid,l=mid+1;
		 else r=mid-1;
	}
	return ans;
}

int main(){
  freopen("newweapon.in","r",stdin);
	freopen("newweapon.out","w",stdout);
  scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&w[i]);
	int l,r;
	for(int i=1;i<n;i++)
		scanf("%d%d",&l,&r),add(l,r),add(r,l);
	bfs();
	dfs(1,-1);
	build(1,n,1);
	scanf("%d",&q);
	int type,u,v;
	while(q--){
    scanf("%d%d%d",&type,&u,&v);
		if(type==1){
			 w[u]=v;
			 update(1,n,bfn[u],v,1);
		}
		else{
			int dep=deep[u]+v;
			int L=pre(beg[dep],en[dep],dfn[u]);
			int R=low(beg[dep],en[dep],dfn[u]+size[u]-1);
			if(L==0||R==0){
				printf("0\n");
				continue;
			}
      ans=0;
			ques(1,n,L,R,1);
			printf("%d\n",ans);
		}
	}
	return 0;
}