#include #include using namespace std; #define rep(i,a,b) for(int i=a;i=b;i--) #define fore(i,a) for(auto& i:a) #define ff first #define ss second #define all(a) begin(a),end(a) #define allr(a) rbegin(a),rend(a) #define pb push_back using ll =long long; using pii=pair; using pll=pair; using vi=vector; using vll=vector; template inline bool chmin(T& a,T b){return a>b?a=b,1:0;} template inline bool chmax(T& a,T b){return a::max()/2; const ll INFL=numeric_limits::max()/2; #define lb(c, x) distance((c).begin(), lower_bound(all(c), (x))) #define ub(c, x) distance((c).begin(), upper_bound(all(c), (x))) long long modpow(long long a, long long n, long long mod) { a%=mod; assert(a!=0||n!=0); if(a==0)return 0; long long res = 1; while (n > 0) { if (n & 1) res = res * a % mod; a = a * a % mod; n >>= 1; } return res; } template struct DisjointSparseTable{ T ti;F f; int sz;int height; vector> data; vector v; int msb(int x){return x==0?-1:31-__builtin_clz(x);} void build(){ for(int i=0;i v,F f,T ti):v(v),f(f),ti(ti){ int n=v.size(); sz=1;height=0; while(sz(sz,ti)); build(); } //[l,r) T prod(int l,int r){ r--; if(l==r)return v[l]; int k=height-msb(l^r)-1; return f(data[k][l],data[k][r]); } }; template DisjointSparseTable get_DST(vector v,F f,T ti){ return DisjointSparseTable(v,f,ti); } void solve(){ } int main(){ cin.tie(0)->sync_with_stdio(0); int n; cin>>n; vector> g(n); vi u(n-1),v(n-1); rep(i,0,n-1){ cin>>u[i]>>v[i]; u[i]--;v[i]--; g[u[i]].pb(v[i]); g[v[i]].pb(u[i]); } int M=300; int q;cin>>q; vector query(q); rep(i,0,q){ int t,u;cin>>t>>u;u--; query[i]={t,u}; } vector ett(2*n); vector in(n),out(n),depth(n); auto dfs=[&,time{0}](auto&& self,int pos,int d=0,int pre=-1)mutable ->void { in[pos]=time; ett[time]={d,pos}; depth[pos]=d; fore(i,g[pos]){ if(i==pre)continue; time++; self(self,i,d+1,pos); time++; ett[time]={d,pos}; } out[pos]=time+1; }; dfs(dfs,0); auto st=get_DST(ett,[](pii a,pii b){return min(a,b);},{-INFI,-INFI}); auto lca=[&](int u,int v){ return st.prod(min(in[u],in[v]),max(out[u],out[v])).ss; }; auto dist=[&](int u,int v){ return depth[u]+depth[v]-2*depth[lca(u,v)]; }; /* rep(i,0,n){ cout<int { if(c[pos]==1&&flag[pos]==0){ dp[pos]=0; } fore(i,g[pos]){ if(i==pre)continue; chmin(dp[pos],self(self,i,pos)+1); } return dp[pos]; }; auto dfs3=[&](auto&& self,int pos,int pre=-1)->void { fore(i,g[pos]){ if(i==pre)continue; chmin(dp[i],dp[pos]+1); self(self,i,pos); } }; for(int i=0;i