Advertisement
Rentib

Untitled

Feb 10th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int n,t,nr;
  5. long long odleglosc[200005];
  6. vector < pair<int,long long> >way[200005];
  7. int up[200005][20];
  8. int preorder[200005];
  9. int postorder[200005];
  10. void dfs(int x,int y)
  11. {
  12.     preorder[x]= ++nr;
  13.     up[x][0]=y;
  14.     for(int i=1;i<=19;i++){ up[x][i]=up[ up[x][i-1] ][i-1]; }
  15.     for( int i=0; i < way[x].size();i++)
  16.     {
  17.         int pp=way[x][i].first;
  18.         long long qq=way[x][i].second;
  19.         if(preorder[pp]==0)
  20.         {
  21.             odleglosc[pp]=odleglosc[x]+qq;
  22.             dfs(pp,x);
  23.         }
  24.     }
  25.     postorder[x]= ++nr;
  26. }
  27. bool daddy(int a,int b)//a przodkiem b
  28. {
  29.     return preorder[a]<=preorder[b] && postorder[a]>=postorder[b];
  30. }
  31. int LCA(int a,int b)
  32. {
  33.     if( daddy(a,b) ){ return a; }
  34.     if( daddy(b,a) ){ return b; }
  35.     for(int i=19;i>=0;i--)
  36.     {
  37.         if( !daddy( up[a][i],b ) ){ a=up[a][i]; }
  38.     }
  39.     return up[a][0];
  40. }
  41. long long wynik(int a,int b)
  42. {
  43.     return ( odleglosc[a] + odleglosc[b] ) - ( 2 * odleglosc[ LCA(a,b) ]);
  44. }
  45. int main()
  46. {
  47.     ios_base::sync_with_stdio(0);
  48.     cin.tie(NULL);
  49.     cin>>n>>t;
  50.     for(int i=1;i<n;i++){
  51.         int a,b;
  52.         long long d;
  53.         cin>>a>>b>>d;
  54.         way[a].emplace_back( make_pair(b,d) );
  55.         way[b].emplace_back( make_pair(a,d) );
  56.     }
  57.     dfs(1,1);
  58.     for(int i=0;i<t;i++){ int a,b;cin>>a>>b; cout<<wynik(a,b)<<'\n'; }
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement