代码如下,好心人帮忙看看吧/kel
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
int l,r,sum;
}t[N<<2];
int n,m,top[N],dfn[N],nfd[N],sz[N],h[N],f[N];
vector<int>e[N];
void DFS(int u,int fa){
f[u]=fa;sz[u]=1;
for(int v:e[u]){
if(v!=fa){
DFS(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[h[u]])h[u]=v;
}
}
}
void dfs(int u,int fa,int T){
dfn[u]=++dfn[0];
top[u]=T;
if(h[u])dfs(h[u],u,T);
for(int v:e[u]){
if(v!=fa&&v!=h[u]){
dfs(v,u,v);
}
}
}
void build(int u,int l,int r){
t[u].l=l;t[u].r=r;
if(l==r){
t[u].sum=0;
return;
}
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
void modify(int u,int aim){
if(t[u].l==aim&&t[u].r==aim){
t[u].sum=1-t[u].sum;
return;
}
int mid=(t[u].l+t[u].r)>>1;
if(mid>=aim)modify(u<<1,aim);
else modify(u<<1|1,aim);
t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
}
int Qry(int u,int l,int r){
if(t[u].l>r||t[u].r<l)return 0;
if(t[u].l>=l&&t[u].r<=r)return t[u].sum;
int mid=t[u].l+t[u].r>>1,ret=0;
if(mid>=l)ret+=Qry(u<<1,l,r);
if(mid+1<=r)ret+=Qry(u<<1|1,l,r);
return ret;
}
int Search(int u,int l,int r){
if(t[u].l==t[u].r)return t[u].l;
int mid=t[u].l+t[u].r>>1;
if(mid>=l&&t[u<<1].sum)return Search(u<<1,l,r);
else return Search(u<<1|1,l,r);
}
int query(int k){
vector<pair<int,int>>q;
while(top[k]!=1){
q.push_back(make_pair(dfn[top[k]],dfn[k]));
k=f[top[k]];
}
q.push_back(make_pair(dfn[1],dfn[k]));
for(int i=(int)q.size()-1;i>=0;i--){
int L=q[i].first,R=q[i].second;
int now=Qry(1,L,R);
if(now)return nfd[Search(1,L,R)];
}
return -1;
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<n;i++){
scanf("%d%d",&x,&y);
e[x].push_back(y);e[y].push_back(x);
}
DFS(1,0);dfs(1,0,1);build(1,1,n);
for(int i=1;i<=n;i++)nfd[dfn[i]]=i;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(x==1){
printf("%d\n",query(y));
}else{
modify(1,dfn[y]);
}
}
// system("pause");
return 0;
}