#include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma warning(disable:4996) typedef long long ll; #define MIN(a, b) ((a)>(b)? (b): (a)) #define MAX(a, b) ((a)<(b)? (b): (a)) #define LINF 9223300000000000000 #define INF 2140000000 const long long MOD = 1000000007; using namespace std; vector vis; vector depth; vector sumw; vector > > g; vector > anc; void dfs( int curr, ll currw, vector& vv ) { vis[curr]=1; depth[curr]=(int)vv.size(); sumw[curr]=currw; int k=1; while(k<=depth[curr]) { anc[curr].push_back(vv[depth[curr]-k]); k*=2; } vv.push_back( curr ); int i; for(i=0; i<(int)g[curr].size(); i++) { if( !vis[g[curr][i].first] ) { dfs( g[curr][i].first, currw+g[curr][i].second, vv ); } } vv.pop_back(); return; } int getanc( int a, int b ) { if(depth[a]>depth[b]) swap(a, b); int delta = depth[b]-depth[a]; int cnt=0; while(delta>0) { if(delta & (1<=0; i--) { if((int)anc[a].size()>i) { if(anc[a][i]!=anc[b][i]) { a = anc[a][i]; b = anc[b][i]; } } } return anc[a][0]; } int main(int argc, char* argv[]) { int n; scanf("%d", &n); vis.resize(n); g.resize(n); depth.resize(n); sumw.resize(n); anc.resize(n); int i; for(i=0; i vv; dfs(0, 0, vv); int Q; scanf("%d", &Q); int q; for(q=0; q