#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 SparseTable { F f; vector > st; vector lookup; SparseTable() = default; explicit SparseTable(const vector &v, const F &f) : f(f) { const int n = (int)v.size(); const int b = 32 - __builtin_clz(n); st.assign(b, vector(n)); for (int i = 0; i < v.size(); i++) { st[0][i] = v[i]; } for (int i = 1; i < b; i++) { for (int j = 0; j + (1 << i) <= n; j++) { st[i][j] = f(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]); } } lookup.resize(v.size() + 1); for (int i = 2; i < lookup.size(); i++) { lookup[i] = lookup[i >> 1] + 1; } } inline T fold(int l, int r) const { int b = lookup[r - l]; return f(st[b][l], st[b][r - (1 << b)]); } }; template SparseTable get_sparse_table(const vector &v, const F &f) { return SparseTable(v, f); } 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=400; 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_sparse_table(ett,[](pii a,pii b){return min(a,b);}); auto lca=[&](int u,int v){ return st.fold(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)]; }; vi c(n); vi dp(n); vi flag(n); vi ver;//いい感じにやる頂点 //全方位木DP auto dfs2=[&](auto&& self,int pos,int pre=-1)->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