#include #include #include #include #include using namespace std; #include struct LCA{ int N; vector >G,parent; vectordepth; LCA(int N_=0):N(N_),G(N_),depth(N_) { int lg=0; while((1<(N_)); } void add_edge(int u,int v) { G[u].push_back(v); G[v].push_back(u); } void dfs(int u,int p,int d) { depth[u]=d; parent[0][u]=p; for(int v:G[u])if(v!=p)dfs(v,u,d+1); } void build(int root=0) { dfs(root,-1,0); for(int k=1;kdepth[v])swap(u,v); for(int k=0;k>k&1)v=parent[k][v]; if(u==v)return u; for(int k=parent.size();k--;)if(parent[k][u]!=parent[k][v]) { u=parent[k][u]; v=parent[k][v]; } return parent[0][u]; } int dist(int u,int v) { int w=lca(u,v); return depth[u]+depth[v]-2*depth[w]; } }; int N; vectorG[2<<17]; vectorV; int L[2<<17],R[2<<17]; void dfs(int u,int p) { L[u]=V.size(); V.push_back(u); for(int v:G[u])if(v!=p)dfs(v,u); R[u]=V.size(); } bool C[2<<17]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>N; LCA lca(N); for(int i=1;i>a>>b; a--,b--; lca.add_edge(a,b); G[a].push_back(b); G[b].push_back(a); } lca.build(0); dfs(0,-1); setS; for(int i=0;i>c; C[i]=c==1; if(C[i])S.insert(L[i]); } atcoder::fenwick_treeBIT(N); for(auto it=S.begin();it!=S.end()&&next(it)!=S.end();it++) { int u=*it; int v=*next(it); BIT.add(u,lca.dist(V[u],V[v])); } int Q;cin>>Q; for(;Q--;) { int op;cin>>op; if(op==1) { int u;cin>>u;u--; if(!C[u]) { auto it=S.lower_bound(L[u]); int l=-1,r=-1; if(it!=S.end())r=*it; if(it!=S.begin())l=*prev(it); if(l!=-1&&r!=-1)BIT.add(l,-lca.dist(V[l],V[r])); if(l!=-1)BIT.add(l,lca.dist(V[l],u)); if(r!=-1)BIT.add(L[u],lca.dist(u,V[r])); S.insert(L[u]); C[u]=true; } else { auto it=S.find(L[u]); assert(it!=S.end()); int l=-1,r=-1; it=S.erase(it); if(it!=S.end())r=*it; if(it!=S.begin())l=*prev(it); if(l!=-1)BIT.add(l,-lca.dist(V[l],u)); if(r!=-1)BIT.add(L[u],-lca.dist(u,V[r])); if(l!=-1&&r!=-1)BIT.add(l,lca.dist(V[l],V[r])); C[u]=false; } } else { int x,y;cin>>x>>y;x--,y--; vector >E; if(x==y)E.push_back(make_pair(0,N)); else if(lca.lca(x,y)==y) { int u=x; int d=lca.depth[x]-lca.depth[y]-1; assert(d>=0); for(int k=0;k>k&1)u=lca.parent[k][u]; E.push_back(make_pair(0,L[u])); E.push_back(make_pair(R[u],N)); } else E.push_back(make_pair(L[y],R[y])); long ans=0; vector >A; //cout<<"S ="; //for(int u:S)cout<<" "<=E[i].second)continue; auto jt=S.lower_bound(E[i].second); assert(jt!=S.begin()); jt--; ans+=BIT.sum(*it,*jt); //cout<<"["<<*it<<", "<<*jt<<")"<<"\n"; A.push_back(make_pair(V[*it],V[*jt])); //cout<<"("<