Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <vector>
- using namespace std;
- vector<vector< int > > Ary;
- long long An[100001][18], Dis[100001][18], P[100001], DPK[100001], DP2[19];
- long long Query(int a,int b)
- {
- if(a == b)
- return 0;
- long long r = 0;
- if(P[a]!=P[b])
- {
- if(P[a] > P[b])
- swap(a,b);
- long long k = DPK[b], d = P[b] - P[a];
- while(d)
- {
- // cout<<k<<" "<<d<<" "<<DP2[k]<<" "<<r<<" "<<Dis[b][k]<<endl;
- if(DP2[k] <= d)
- {
- d -= DP2[k];
- r += Dis[b][k];
- b = An[b][k];
- }
- k--;
- }
- }
- int k = DPK[P[a]];
- //cout<<r<<"---"<<a<<" "<<b<<endl;
- if(a == b)
- return r;
- while(k>=0)
- {
- //cout<<a<<" "<<b<<" "<<An[a][k]<<" "<<An[b][k]<<" | | "<<r<<" - "<<k<<endl;
- if(An[a][k]!=An[b][k])
- {
- r += Dis[a][k] + Dis[b][k];
- a = An[a][k], b = An[b][k];
- }
- k--;
- }
- r+= Dis[a][0] + Dis[b][0];
- return r;
- }
- void DFS(int n,int d)
- {
- P[n] = d;
- for(int i = 1;i<18;i++)
- {
- An[n][i] = An[An[n][i-1]][i-1];
- Dis[n][i] = Dis[An[n][i-1]][i-1] + Dis[n][i-1];
- }
- for(auto k : Ary[n])
- DFS(k,d+1);
- }
- void Caso(int N)
- {
- Ary.clear();
- Ary.resize(N,vector<int> (0));
- memset(An,0,sizeof(An));
- memset(Dis,0,sizeof(Dis));
- memset(P,0,sizeof(P));
- for(int i = 1;i<N;i++)
- {
- int a,l;
- scanf("%d %d",&a,&l);
- // cout<<"Leido un nodo -------------"<<endl;
- An[i][0] = a, Dis[i][0] = l;
- Ary[a].push_back(i);
- }
- DFS(0,0);
- int Q;
- scanf("%d",&Q);
- for(int i = 0;i<Q;i++)
- {
- int a,b;
- scanf("%d %d",&a,&b);
- printf("%lld",Query(a,b));
- if(i<Q-1)
- printf(" ")
- }
- //printf("\n");
- }
- int main()
- {
- memset(DP2,0,sizeof(DP2)), memset(DPK,0,sizeof(DPK));
- for(int i = 1, k = 0;i<100000;i*=2,k++)
- {
- DPK[i] = 1;
- DP2[k] = i;
- }
- for(int i = 1;i<100000;i++)
- DPK[i]+=DPK[i-1];
- int n;
- scanf("%d",&n);
- while(n)
- {
- //cout<<"--------"<<endl;
- Caso(n);
- //cout<<"--------"<<endl;
- scanf("%d",&n);
- if(n)
- printf("\n");
- }
- }
- /*
- 6
- 0 8
- 1 7
- 1 9
- 0 3
- 4 2
- 4
- 2 3
- 5 2
- 1 4
- 0 3
- 2
- 0 1
- 2
- 1 0
- 0 1
- 6
- 0 1000000000
- 1 1000000000
- 2 1000000000
- 3 1000000000
- 4 1000000000
- 15
- 5 0
- 4 0
- 3 0
- 2 0
- 1 0
- 5 1
- 4 1
- 3 1
- 2 1
- 5 2
- 4 2
- 3 2
- 5 3
- 4 3
- 5 4
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement