1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include<bits/stdc++.h> using namespace std; void read(int &x) { x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f; } void print(int x) { if(x<0) putchar('-'),x=-x; if(!x) return ;print(x/10),putchar(x%10+48); } void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} #define lf double #define pii pair<int,int > #define vec vector<int > #define pb push_back #define mp make_pair #define fr first #define sc second #define FOR(i,l,r) for(int i=l,i##_r=r;i<=i##_r;i++) const int maxn = 1e6+10; const int inf = 1e9; const lf eps = 1e-8; const int mod = 1e9+7; #define ls son[x][0] #define rs son[x][1] int fa[maxn],son[maxn][2],sz[maxn],rev[maxn],sta[maxn],top,n,m,col[maxn],cov[maxn]; void update(int x) {sz[x]=sz[ls]+sz[rs]+1;} int which(int x) {return son[fa[x]][1]==x;} int nrt(int x) {return son[fa[x]][0]==x||son[fa[x]][1]==x;} void push_cov(int x,int v) {col[x]=cov[x]=v;} void push_rev(int x) {swap(ls,rs);rev[x]^=1;} void pushdown(int x) { if(cov[x]) push_cov(ls,cov[x]),push_cov(rs,cov[x]),cov[x]=0; if(rev[x]) rev[x]=0,push_rev(ls),push_rev(rs); } void rotate(int x) { int y=fa[x],z=fa[y],w=which(x); if(nrt(y)) son[z][son[z][1]==y]=x; fa[x]=z,fa[y]=x,fa[son[x][w^1]]=y,son[y][w]=son[x][w^1],son[x][w^1]=y; update(y),update(x); } void splay(int x) { int t=x;while(nrt(t)) sta[++top]=t,t=fa[t]; sta[++top]=t;while(top) pushdown(sta[top--]); while(nrt(x)) { int y=fa[x],z=fa[y]; if(nrt(y)) rotate(((son[z][1]==y)^(son[y][1]==x))?x:y); rotate(x); }update(x); } struct BIT { int t[maxn]; void modify(int x,int v) {if(!x) return ;for(;x<=n+m;x+=x&-x) t[x]+=v;} int query(int x,int ans=0) {for(;x;x-=x&-x) ans+=t[x];return ans;} }T; void access(int x,int c) { for(int t=0;x;t=x,x=fa[x]) { splay(x); T.modify(col[x],-sz[ls]-1); rs=t;push_cov(ls,c);pushdown(ls);col[x]=c; T.modify(c,sz[ls]+1);update(x); } } void link(int x,int y) { access(x,0);splay(x);push_rev(x); fa[x]=y; } int query(int x) { splay(x); int res=T.query(col[x]-1); splay(x);res+=sz[rs]+1;return res; } char s[20];int cnt; void up(int x) { access(x,cnt),splay(x),push_rev(x),pushdown(x); T.modify(cnt,-1);push_cov(x,++cnt),sz[x]=1,rs=0; T.modify(cnt,1); } int main() { read(n),read(m); for(int i=1,x,y;i<n;i++) read(x),read(y),link(x,y); for(int i=1;i<=n;i++) up(i); for(int i=1;i<=m;i++) { scanf("%s",s+1);int x,y;read(x); if(s[1]=='u') up(x); else if(s[1]=='w') write(query(x)); else read(y),write(query(x)<query(y)?x:y); } return 0; }
|