| 记录编号 |
255421 |
评测结果 |
AAAAAATTTT |
| 题目名称 |
2288.[HZOI 2015]疯狂的魔法树 |
最终得分 |
60 |
| 用户昵称 |
Aglove |
是否通过 |
未通过 |
| 代码语言 |
C++ |
运行时间 |
9.103 s |
| 提交时间 |
2016-04-27 19:03:51 |
内存使用 |
5.66 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
using namespace std;
const int maxn=200010;
int n,m,u,v,a,b,val;
int h[maxn],cnt=0;
int c[maxn];
struct edge{
int to,next;
}G[maxn<<1];
int fa[maxn],ans=0;
void add(int x,int y){
++cnt;G[cnt].to=y;G[cnt].next=h[x];h[x]=cnt;
}
void DFS(int u,int f){
fa[u]=f;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(v==f)continue;
DFS(v,u);
}return;
}
void Get_ans(int u){
if(c[u]>=a&&c[u]<=b)ans++;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(v==fa[u])continue;
Get_ans(v);
}return;
}
void Get_add(int u){
c[u]+=val;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(v==fa[u])continue;
Get_add(v);
}return;
}
void Get_modify(int u){
c[u]=val;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(v==fa[u])continue;
Get_modify(v);
}return;
}
void debug(){
for(int i=1;i<=n;++i)printf("%d ",c[i]);
printf("\n");return;
}
int main(){
freopen("H_Tree.in","r",stdin);
freopen("H_Tree.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%d",&c[i]);
for(int i=1;i<n;++i){
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}DFS(1,-1);
for(int i=1;i<=m;++i){
char ch=getchar();
while(ch<'!')ch=getchar();
if(ch=='Q'){
scanf("%d%d%d",&u,&a,&b);
ans=0;Get_ans(u);
printf("%d\n",ans);
}else if(ch=='M'){
scanf("%d%d",&u,&val);
c[u]=val;
}else if(ch=='C'){
scanf("%d%d",&u,&val);
Get_add(u);
}else if(ch=='W'){
scanf("%d%d",&u,&val);
Get_modify(u);
}else{
scanf("%d%d",&u,&v);
n++;fa[n]=u;add(u,n);
c[n]=v;
}
//debug();
}return 0;
}