比赛 |
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;
}