比赛 |
20161116 |
评测结果 |
AAAATTTTTT |
题目名称 |
新型武器 |
最终得分 |
40 |
用户昵称 |
coolkid |
运行时间 |
6.021 s |
代码语言 |
C++ |
内存使用 |
10.32 MiB |
提交时间 |
2016-11-16 11:54:10 |
显示代码纯文本
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<vector>
- using namespace std;
-
- const int MAXN=300010;
-
- struct Edge{
- int to,nxt;
- }edges[MAXN<<1];
- int head[MAXN],cnt=0;
- int val[MAXN];
- vector<int>p[MAXN];
- int dep[MAXN],n;
- int fa[MAXN];
-
- void addedge(int f,int t){
- edges[cnt].to=t;
- edges[cnt].nxt=head[f];
- head[f]=cnt++;
- }
-
- void init(){
- memset(fa,0,sizeof(fa));
- memset(head,-1,sizeof(head));
- scanf("%d",&n);
- for(int i=1;i<=n;i++) scanf("%d",&val[i]);
- for(int i=1;i<n;i++){
- int x,y;
- scanf("%d%d",&x,&y);
- addedge(x,y);
- addedge(y,x);
- }
- }
-
- void dfs(int u){
- for(int i=head[u];~i;i=edges[i].nxt){
- int v=edges[i].to;
- if(fa[u]==v) continue;
- fa[v]=u;
- dep[v]=dep[u]+1;
- p[dep[v]].push_back(v);
- dfs(v);
- }
- }
-
- void work(){
- memset(dep,0,sizeof(dep));
- fa[1]=0;
- dfs(1);
- int Q;
- scanf("%d",&Q);
- while(Q--){
- int opt;
- scanf("%d",&opt);
- if(opt==1){
- int u,v;
- scanf("%d%d",&u,&v);
- val[u]=v;
- }
- else{
- int u,c;
- scanf("%d%d",&u,&c);
- int dpt=dep[u]+c;
- int ans=0;
- for(int i=0;i<p[dpt].size();i++){
- int v=p[dpt][i];
- int F=v;
- while(F!=0){
- if(F==u){
- ans+=val[v];
- }
- F=fa[F];
- }
- }
- printf("%d\n",ans);
- }
- }
- }
-
- int main(){
- freopen("newweapon.in","r",stdin);
- freopen("newweapon.out","w",stdout);
- init();
- work();
- return 0;
- }