Advertisement
Saleh127

Light OJ 1128 / Binary Lifting

Feb 2nd, 2022
802
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. /***
  2.  created: 2022-02-02-15.36.52
  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. ll parent[100005];
  13. ll logg2[100005];
  14. vector<vector<ll> >blift;
  15. ll val[100005];
  16. ll lg,n;
  17.  
  18. void logg()
  19. {
  20.     logg2[1]=0;
  21.  
  22.     for(ll i=2; i<=100005; i++)
  23.     {
  24.         logg2[i]=logg2[i/2]+1;
  25.     }
  26. }
  27.  
  28. void binarylifting()
  29. {
  30.     for(ll i=0; i<n; i++)
  31.     {
  32.         blift[i][0]= parent[i];
  33.     }
  34.  
  35.     for(ll j=1; j<lg; j++)
  36.     {
  37.         for(ll i=0; i<n; i++)
  38.         {
  39.             if(blift[i][j-1]!=-1)
  40.             {
  41.                 ll par=blift[i][j-1];
  42.  
  43.                 blift[i][j]=blift[par][j-1];
  44.             }
  45.         }
  46.     }
  47. }
  48.  
  49. ll get_lca(ll node,ll v)
  50. {
  51.     for(ll j=lg-1; j>=0; j--)
  52.     {
  53.         if(blift[node][j]==-1 || val[blift[node][j]]<v)
  54.         {
  55.             continue;
  56.         }
  57.         node=blift[node][j];
  58.     }
  59.     return node;
  60. }
  61.  
  62.  
  63. int main()
  64. {
  65.     ios_base::sync_with_stdio(0);
  66.     cin.tie(0);
  67.     cout.tie(0);
  68.  
  69.     test
  70.     {
  71.         ll q,m,i,j,k,l;
  72.  
  73.         cin>>n>>q;
  74.  
  75.         val[0]=1;
  76.  
  77.         for(i=1; i<n; i++)
  78.         {
  79.             cin>>m>>l;
  80.             parent[i]=m;
  81.             val[i]=l;
  82.         }
  83.  
  84.         lg=0;
  85.  
  86.         while((1<<lg)<=n) lg++;
  87.  
  88.         blift = vector<vector<ll>>(n,vector<ll>(lg,-1));
  89.  
  90.         binarylifting();
  91.  
  92.         cout<<"Case "<<cs<<":"<<nl;
  93.  
  94.         while(q--)
  95.         {
  96.             cin>>j>>k;
  97.  
  98.             cout<<get_lca(j,k)<<nl;
  99.         }
  100.     }
  101.  
  102.     get_lost_idiot;
  103. }
  104.  
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement