#include<bits/stdc++.h> #define FILE "read" #define MAXN 100010 #define INF 1e9 using namespace std; struct node{int y,next;}e[MAXN<<1]; int n,m,dfs_clock,len,root,v[MAXN],L[MAXN],R[MAXN],f[MAXN],Link[MAXN],deep[MAXN],anc[MAXN][25],tr[MAXN<<2]; inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();} return x*f; } void insert(int x,int y){e[++len].next=Link[x];Link[x]=len;e[len].y=y;} void dfs(int x){ L[x]=++dfs_clock; anc[x][0]=f[x]; for(int i=1;i<=20;++i) anc[x][i]=anc[anc[x][i-1]][i-1]; for(int i=Link[x];i;i=e[i].next)if(e[i].y!=f[x]){ deep[e[i].y]=deep[x]+1; dfs(e[i].y); } R[x]=dfs_clock; } void change(int p,int l,int r,int x,int v){ if(l==r) {tr[p]=v; return;} int mid=(l+r)>>1; if(x<=mid) change(p<<1,l,mid,x,v); else change(p<<1|1,mid+1,r,x,v); tr[p]=min(tr[p<<1],tr[p<<1|1]); } int query(int p,int l,int r,int x,int y){ if(x>r||y<l) return INF; if(x<=l&&y>=r) return tr[p]; int mid=(l+r)>>1; return min(query(p<<1,l,mid,x,y),query(p<<1|1,mid+1,r,x,y)); } int getans(int x){ if(x==root) return query(1,1,n,1,n); else if(L[x]<=L[root]&&R[x]>=R[root]){ int y=root; for(int i=20;i>=0;--i)if(deep[anc[y][i]]>deep[x]) y=anc[y][i]; return min(query(1,1,n,1,L[y]-1),query(1,1,n,R[y]+1,n)); } else return query(1,1,n,L[x],R[x]); } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); n=read(); m=read(); deep[1]=1; for(int i=1;i<=n;++i){ f[i]=read(); v[i]=read(); insert(i,f[i]); insert(f[i],i); } dfs(1); root=1; for(int i=1;i<=n;++i) change(1,1,n,L[i],v[i]); for(int i=1;i<=m;++i){ char ch[5]; scanf("%s",ch); int x,y; switch(ch[0]){ case 'V':x=read(),y=read();change(1,1,n,L[x],y);break; case 'E':x=read(),root=x;break; case 'Q':x=read();printf("%d\n",getans(x));break; } } return 0; }
|