比赛 20161116 评测结果 TTTTTTTTTT
题目名称 新型武器 最终得分 0
用户昵称 jmisnal 运行时间 10.000 s
代码语言 C++ 内存使用 17.01 MiB
提交时间 2016-11-16 11:24:42
显示代码纯文本
#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#define ll long long
using namespace std;
int read()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x;
}
struct data{
	int to,next;
}e[650000];
int head[300100],cnt;
void insert(int u,int v)
{
//	cout<<u<<' '<<v<<endl;
	e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
}
struct abcd{
	int l,r,v;
}tr[300300];
int hash[300300],ind,fa[300300];
int n,v[300300];
bool hav[300300];
queue<int>Q;
void bfs()
{
	Q.push(1);
	while(!Q.empty())
	{
		int now=Q.front();
		Q.pop();
		cout<<now<<' '<<ind<<endl;
		if(hav[now])continue;
		hav[now]=1;
		hash[now]=++ind;
		for(int i=head[now];i;i=e[i].next)
		{
			int to=e[i].to;
			if(hav[to])continue;
			
			Q.push( to );
		}
	}
}
int lowbit(int x)
{
	return x&(-x);
}
ll c[300300];
void add(int x,int v)
{
//	cout<<x<<' '<<v<<endl;
	for(int i=x;i<=n;i+=lowbit(i))
		c[i]+=v;
}
ll ask(int x)
{
	ll ret=0;
	for(int i=x;i>0;i-=lowbit(i))
		ret+=c[i];
	return ret;
}
void dfs(int now,int fa)
{
//	cout<<now<<' '<<fa<<endl; 
	tr[hash[now]].v=v[now];
	int l=0,r=0;
	for(int i=head[now];i;i=e[i].next)
	{
		int to=e[i].to;
		if(to==fa)continue;
		if(l==0)l=hash[to];
		if(r==0)r=hash[to];
		if(hash[to]<l)l=hash[to];
		if(hash[to]>r)r=hash[to];
		dfs(to,now);
	}
	tr[hash[now]].l=l;tr[hash[now]].r=r;
	add(hash[now],v[now]);
//	cout<<now<<' '<<hash[now]<<' '<<tr[hash[now]].v<<' '<<tr[hash[now]].l<<' '<<tr[hash[now]].r<<endl;
}
int deep[300300],sbdeep;
int zez(int x,int sd)
{
//	cout<<x<<' '<<sd<<endl;
	if(sd==sbdeep)
		return x;
	return zez( tr[x].l ,sd+1);
}
int yez(int x,int sd)
{
	if(sd==sbdeep)
		return x;
	return yez(tr[x].r,sd+1);
}
int main()
{
//	freopen("abcd.in","r",stdin);
	freopen("newweapon.in","r",stdin);
	freopen("newweapon.in","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
		v[i]=read();
	for(int i=1;i<n;i++)
	{
		int x,y;x=read();y=read();
		insert(x,y);
		insert(y,x);
	}
	bfs();
//	cout<<hash[3]<<' ';
//	for(int i=1;i<=n;i++)
//		cout<<i<<' '<<hash[i]<<endl;
	dfs(1,0);
//	for(int i=1;i<=n;i++)
//		cout<<i<<' '<<c[i]<<endl;
	int sbt=read();
//	sbdeep=1;
//	cout<<yez(1,0);return 0;
	
	while(sbt--)
	{
		int x=read(),y=read(),z=read();
		if(x==2)
		{
			sbdeep=z;
			int sb=zez(hash[y],0)-1;
			int sd=yez(hash[y],0);
			printf("%lld\n", ask(sd)-ask(sb)  );
		}
		else
		{
			add(hash[y],z-v[y]);
		}
	}
	return 0;
}