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
| #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar> #define W while #define I inline #define RI register int #define LL long long #define Cn const #define CI Cn int& #define gc getchar #define D isdigit(c=gc()) #define pc(c) putchar((c)) #define min(x,y) ((x)<(y)?(x):(y)) #define max(x,y) ((x)>(y)?(x):(y)) using namespace std; namespace Debug{ Tp I void _debug(Cn char* f,Ty t){cerr<<f<<'='<<t<<endl;} Ts I void _debug(Cn char* f,Ty x,Ar... y){W(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} Tp ostream& operator<<(ostream& os,Cn vector<Ty>& V){os<<"[";for(Cn auto& vv:V) os<<vv<<",";os<<"]";return os;} #define gdb(...) _debug(#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; namespace FastIO{ Tp I void read(Ty& x){char c;int f=1;x=0;W(!D) f=c^'-'?1:-1;W(x=(x<<3)+(x<<1)+(c&15),D);x*=f;} Ts I void read(Ty& x,Ar&... y){read(x),read(y...);} Tp I void write(Ty x){x<0&&(pc('-'),x=-x,0),x<10?(pc(x+'0'),0):(write(x/10),pc(x%10+'0'),0);} Tp I void writeln(Cn Ty& x){write(x),pc('\n');} }using namespace FastIO; Cn int N=1e5+10; int n,m,fir[N],nxt[N<<1],son[N<<1],tot,dep[N],f[N][21],sz[N],mx[N],dfn[N],top[N],bk[N],cnt; I void Add(CI x,CI y){nxt[++tot]=fir[x],fir[x]=tot,son[tot]=y;} #define to son[i] I void Dfs1(CI x,CI fa){RI i;for(dep[x]=dep[f[x][0]=fa]+(sz[x]=1),i=fir[x];i;i=nxt[i]) to^fa&&(Dfs1(to,x),sz[x]+=sz[to],sz[mx[x]]<sz[to]&&(mx[x]=to));} I void Dfs2(CI x,CI Top){ if(top[x]=Top,bk[dfn[x]=++cnt]=x,mx[x]) Dfs2(mx[x],Top); RI i;for(i=fir[x];i;i=nxt[i]) to^f[x][0]&&to^mx[x]&&(Dfs2(to,to),0); } class SegmentTree{ private: LL T[N<<2],tg[N<<2]; #define mid (l+r>>1) #define PT CI x=1,CI l=1,CI r=n #define LT x<<1,l,mid #define RT x<<11,mid+1,r #define PU(x) (T[x]=T[x<<1]+T[x<<11]) I void PD(CI x,CI l,CI r){tg[x]&&(T[x<<1]+=tg[x]*(mid-l+1),tg[x<<1]+=tg[x],T[x<<11]+=tg[x]*(r-mid),tg[x<<11]+=tg[x],tg[x]=0);} public: I void U(CI L,CI R,CI v,PT){ if(L<=l&&r<=R) return T[x]+=v*(r-l+1),tg[x]+=v,void(); PD(x,l,r),L<=mid&&(U(L,R,v,LT),0),R>mid&&(U(L,R,v,RT),0),PU(x); } I LL Q(CI L,CI R,PT){ if(L<=l&&r<=R) return T[x]; LL S=0;return PD(x,l,r),L<=mid&&(S+=Q(L,R,LT)),R>mid&&(S+=Q(L,R,RT)),S; } I int G(LL k,PT){ if(l==r) return bk[l]; return PD(x,l,r),T[x<<1]>=k?G(k,LT):G(k-T[x<<1],RT); } I LL S(){return T[1];} }T; I void U(RI x,RI y){ W(top[x]^top[y]) dep[top[x]]<dep[top[y]]&&(swap(x,y),0),T.U(dfn[top[x]],dfn[x],1),x=f[top[x]][0]; dfn[x]>dfn[y]&&(swap(x,y),0),T.U(dfn[x],dfn[y],1); } I int Q(){ LL k=T.S()/2+1;RI j,i=T.G(k); if(T.Q(dfn[i],dfn[i]+sz[i]-1)>=k) return i; for(j=20;~j;j--) if(f[i][j]&&T.Q(dfn[f[i][j]],dfn[f[i][j]]+sz[f[i][j]]-1)<k) i=f[i][j]; return f[i][0]; } int main(){ RI i,j,o,x,y;for(read(n),i=1;i<n;i++) read(x,y),Add(x,y),Add(y,x);for(Dfs1(1,0),Dfs2(1,1),j=1;j<=20;j++) for(i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; for(read(m);m--;) read(o,x),o&1?T.U(dfn[x],dfn[x]+sz[x]-1,1):(read(y),U(x,y)),writeln(Q());return 0; }
|