Saleh127

Light OJ 1162 / LCA

Feb 2nd, 2022
1,458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. /***
  2.  created: 2022-02-03-01.29.40
  3. ***/
  4.  
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. #define ll long long
  8. #define test int tt; cin>>tt; for(int cs=1;cs<=tt;cs++)
  9. #define get_lost_idiot return 0
  10. #define nl '\n'
  11.  
  12. vector<pair<ll,ll>>g[100005];
  13.  
  14. ll blift[100005][19];
  15. ll mx[100005][19];
  16. ll mn[100005][19];
  17. ll depth[100005];
  18. bool v[100005];
  19. ll n,lg;
  20.  
  21. void dfs(ll node)
  22. {
  23.     v[node]=1;
  24.     for(auto d:g[node])
  25.     {
  26.         if(v[d.first]==0)
  27.         {
  28.             depth[d.first]=depth[node]+1;
  29.             blift[d.first][0]=node;
  30.             mx[d.first][0]=d.second;
  31.             mn[d.first][0]=d.second;
  32.             dfs(d.first);
  33.         }
  34.     }
  35. }
  36.  
  37. void binarylifting()
  38. {
  39.     for(ll j=1; j<=lg; j++)
  40.     {
  41.         for(ll i=1; i<=n; i++)
  42.         {
  43.             if(blift[i][j-1]!=-1)
  44.             {
  45.                 ll par = blift[i][j-1];
  46.  
  47.                 blift[i][j] = blift[par][j-1];
  48.  
  49.                 mx[i][j] = max( mx[i][j-1], mx[par][j-1] );
  50.                 mn[i][j] = min( mn[i][j-1], mn[par][j-1] );
  51.             }
  52.         }
  53.     }
  54. }
  55.  
  56. void minmaxroad(ll a,ll b)
  57. {
  58.     ll mnr=INT_MAX, mxr=INT_MIN;
  59.  
  60.     if(depth[a]<depth[b]) swap(a,b);
  61.  
  62.     ll k=depth[a]-depth[b];
  63.  
  64.     for(ll j=lg-1; j>=0; j--)
  65.     {
  66.         if(k &(1<<j))
  67.         {
  68.             mnr= min(mnr, mn[a][j]);
  69.             mxr= max(mxr, mx[a][j]);
  70.  
  71.             a=blift[a][j];
  72.         }
  73.     }
  74.  
  75.     if(a==b)
  76.     {
  77.         cout<<mnr<<" "<<mxr<<nl;
  78.         return;
  79.     }
  80.  
  81.     for(ll j=lg-1; j>=0; j--)
  82.     {
  83.         if(blift[b][j]!=-1 &&  blift[a][j]!=blift[b][j])
  84.         {
  85.             mnr= min(mnr,min(mn[a][j], mn[b][j]));
  86.             mxr= max(mxr,max(mx[a][j], mx[b][j]));
  87.  
  88.             a=blift[a][j];
  89.             b=blift[b][j];
  90.         }
  91.     }
  92.  
  93.     mnr= min(mnr,min(mn[a][0], mn[b][0]));
  94.     mxr= max(mxr,max(mx[a][0], mx[b][0]));
  95.  
  96.     cout<<mnr<<" "<<mxr<<nl;
  97.  
  98.     return;
  99. }
  100.  
  101. void clr()
  102. {
  103.     for(ll j=0; j<n+1; j++)
  104.     {
  105.         g[j].clear();
  106.         depth[j]=0;
  107.         v[j]=0;
  108.         for(ll i=0; i<lg; i++)
  109.         {
  110.             mx[j][i]=INT_MIN;
  111.             mn[j][i]=INT_MAX;
  112.             blift[j][i]=-1;
  113.         }
  114.     }
  115. }
  116.  
  117. int main()
  118. {
  119.     ios_base::sync_with_stdio(0);
  120.     cin.tie(0);
  121.     cout.tie(0);
  122.  
  123.     test
  124.     {
  125.         ll q,i,j,k,l;
  126.  
  127.         cin>>n;
  128.  
  129.         lg=0;
  130.  
  131.         while((1<<lg)<=n) lg++;
  132.  
  133.         clr();
  134.  
  135.         for(i=1; i<n; i++)
  136.         {
  137.             cin>>j>>k>>l;
  138.  
  139.             g[j].push_back({k,l});
  140.             g[k].push_back({j,l});
  141.         }
  142.  
  143.         memset(blift,-1,sizeof blift);
  144.  
  145.         dfs(1);
  146.  
  147.         binarylifting();
  148.  
  149.         cout<<"Case "<<cs<<":"<<nl;
  150.  
  151.         cin>>q;
  152.  
  153.         while(q--)
  154.         {
  155.             cin>>j>>k;
  156.  
  157.             minmaxroad(j,k);
  158.         }
  159.     }
  160.  
  161.     get_lost_idiot;
  162. }
  163.  
Advertisement
Add Comment
Please, Sign In to add comment