#include #define mp make_pair #define fi first #define se second #define debug(x) cerr<<#x<<" = "<<(x)<void test(T x,Args... args){cerr< pii; typedef pair pll; const int MAXN=(int)1e5+5; const int MOD=(int)1e9+7; template struct BIT{ T a[size]; int n; void init(int _n){n=_n;fill(a+1,a+1+n,0);} void update(int x,T y){for(int i=x;i<=n;i+=i&-i)a[i]+=y;} T query(int x){T re=0;for(int i=x;i;i-=i&-i)re+=a[i];return re;} T query(int l,int r){return query(r)-query(l-1);} }; struct edge{ int to,nxt; }ed[MAXN*2]; int head[MAXN],cnt; void addedge(int u,int v){ ed[cnt]={v,head[u]}; head[u]=cnt++; } int L[MAXN],R[MAXN],dfsx,f[MAXN][20],p[MAXN],dep[MAXN]; void dfs(int u,int pre){ L[u]=++dfsx; dep[u]=dep[pre]+1; p[dfsx]=u; f[u][0]=pre; /// test("dfs",u,pre); for(int i=1;i<=16;i++)f[u][i]=f[f[u][i-1]][i-1]; for(int i=head[u];i!=-1;i=ed[i].nxt){ int v=ed[i].to; if(v==pre)continue; dfs(v,u); } R[u]=dfsx; } bool isHas(int u,int v){ return L[u]<=L[v]&&R[v]<=R[u]; } int LCA(int u,int v){ if(isHas(u,v))return u; if(isHas(v,u))return v; for(int i=16;i>=0;i--){ if(f[u][i]&&!isHas(f[u][i],v))u=f[u][i]; } return f[u][0]; } BITbit; int getF(int u){ for(int i=16;i>=0;i--){ if(f[u][i]==0)continue; if(bit.query(L[f[u][i]])>0)u=f[u][i]; } return u; } int ans[MAXN*2]; vectorve[MAXN]; void solve(){ int n; cin>>n; fill(head+1,head+1+n,-1); cnt=0; dfsx=0; bit.init(n); for(int i=1;i>u>>v; addedge(u,v); addedge(v,u); } dfs(1,0); int m; cin>>m; int tot=0; for(int i=1;i<=m;i++){ int op,u,v; cin>>op>>u; if(op==1){ bit.update(L[u],1); bit.update(R[u]+1,-1); } else { cin>>v; ans[++tot]=0; bool f1=bit.query(L[u])>0,f2=bit.query(L[v])>0; if(f1&&f2&&getF(u)==getF(v)){ int f=getF(u); if(u0){ ans[q.se]+=i-bit.query(q.fi); } else { q.fi=-q.fi; ans[q.se]-=i-bit.query(q.fi); } } ve[i].clear(); } for(int i=1;i<=tot;i++)cout<>t; while(t--){ solve(); } return 0; }