我在学校oj上交就过了,不知道为什么在nigu 就RE了,求调。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstring>
#include <algorithm>
#define ls 2*v
#define rs 2*v+1
using namespace std;
const int maxn=1000000+10;
struct Edge{
int v,next;
}edge[maxn];
struct node{
int l,r,ans=0;
}tree[maxn];
int vis[maxn];
int head[maxn],tot;
void add_edge(int u,int v){
edge[++tot].v=v;
edge[tot].next=head[u];
head[u]=tot;
}
int dfn[maxn],dep[maxn];
int ed[maxn];
void dfs(int u,int f){
dfn[u]=++dfn[0];
dep[u]=dep[f]+1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v==f)continue;
dfs(v,u);
}
ed[u]=dfn[0];
}
void build(int l,int r,int v){
tree[v].l=l;
tree[v].r=r;
if(l==r){
return ;
}
int mid=(l+r)>>1;
build(l,mid,ls);
build(mid+1,r,rs);
}
void update(int x,int y,int v,int k){
int l=tree[v].l;
int r=tree[v].r;
if(tree[v].ans&&dep[tree[v].ans]>dep[k])return ;
if(x<=l&&y>=r){
tree[v].ans=k;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)update(x,y,ls,k);
if(y>mid)update(x,y,rs,k);
}
int ans=1;
void ask(int x,int v){
if(tree[v].ans&&dep[tree[v].ans]>dep[ans])ans=tree[v].ans;
int l=tree[v].l;
int r=tree[v].r;
if(l==r)return ;
int mid=(l+r)>>1;
if(x<=mid){
ask(x,ls);
}else{
ask(x,rs);
}
}
int main(){
int n,q;
cin>>n>>q;
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
dep[0]=-1;
dfs(1,0);
build(1,n,1);
getchar();
for(int i=1;i<=q;i++){
char c;
int x;
scanf("%c%d",&c,&x);
getchar();
if(c=='Q'){
ans=1;
ask(dfn[x],1);
printf("%d\n",ans);
}else{
if(vis[x])continue;
vis[x]=1;
update(dfn[x],ed[x],1,x);
}
}
return 0;
}