应该是越界了,但是不知道哪里越界了。
只A了最后一个点
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int w=0,x=0;char ch;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return w?-x:x;
}
vector <int > e[100005];
void add(int u,int v){
e[u].push_back(v);
e[v].push_back(u);
}
int n,m;
char ch,g,h;
int dep[100005],fa[100005],size[100005],son[100005],dfn[100005],rnk[100005],top[100005];
int cnt;
void dfs1(int now,int f){
fa[now]=f,dep[now]=dep[f]+1;
size[now]=1;
for(int i=0;i<e[now].size();i++){
int to=e[now][i];
if(to==f) continue;
dfs1(to,now);
size[now]+=size[to];
if(size[to]>size[son[now]]) son[now]=to;
}
}
void dfs2(int x,int y){
top[x]=y;
dfn[x]=++cnt,rnk[cnt]=x;
if(son[x]) dfs2(son[x],y);
for(int i=0;i<e[x].size();i++){
int to=e[x][i];
if(to==fa[x]||to==son[x]) continue;
dfs2(to,to);
}
}
struct segment_tree{
int l,r;
int dat;
}t[5000005];
void pushup(int p){
t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].dat=-1;
return ;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
pushup(p);
}
void change(int p,int x){
if(t[p].l==t[p].r&&t[p].l==x){
t[p].dat=x;
return ;
}
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid) change(p*2,x);
else change(p*2+1,x);
pushup(p);
}
int query(int p,int l,int r){
if(l<1||r>n) return 1;
if(l>t[p].r||r<t[p].l) return 0;
if(l<=t[p].l&&t[p].r<=r) return t[p].dat;
int mid=(t[p].l+t[p].r)>>1;
int val=-1;
if(l<=mid) val=max(val,query(p*2,l,r));
if(r>mid) val=max(val,query(p*2+1,l,r));
return val;
}
void query_on_tree(int x){
while(x!=1){
if(query(1,dfn[top[x]],dfn[x])!=-1){
cout<<rnk[query(1,dfn[top[x]],dfn[x])]<<endl;
return ;
}
x=fa[top[x]];
}
if(x==1) cout<<1<<endl;
}
int main(){
n=read(),m=read();
for(int i=1;i<n;i++){
g=read(),h=read();
add(g,h);
}
dfs1(1,0);
fa[1]=1;
dfs2(1,1);
build(1,1,n+1);
change(1,1);
/*
for(int i=1;i<=n;i++){
cout<<dfn[i]<<endl;
}
*/
for(int i=1;i<=m;i++){
cin>>ch,g=read();
if(ch=='C'){
change(1,dfn[g]);
}
else{
query_on_tree(g);
}
}
return 0;
}