Advertisement
Saleh127

UVA 12238 / LCA + Segment Tree + Euler Tour

Feb 5th, 2022
1,119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define test int tt; cin>>tt; for(int cs=1;cs<=tt;cs++)
  5. #define get_lost_idiot return 0
  6. #define nl '\n'
  7.  
  8. vector<ll>g[100005];
  9. ll a[200020];
  10. ll tree[800050];
  11. ll st[100005];
  12. ll fn[100005];
  13. bool v[100005];
  14. ll blift[100005][20];
  15. ll depth[100005];
  16. ll tim=1,lg,n;
  17. ll val[100005];
  18.  
  19. void eulerpath(ll node)
  20. {
  21.     st[node]=tim;
  22.     tim++;
  23.     v[node]=1;
  24.     for(auto d:g[node])
  25.     {
  26.         if(v[d]==0)
  27.         {
  28.             eulerpath(d);
  29.         }
  30.     }
  31.     fn[node]=tim;
  32.     tim++;
  33. }
  34.  
  35. void dfs(ll node)
  36. {
  37.     v[node]=1;
  38.     for(int d:g[node])
  39.     {
  40.         if(v[d]==0)
  41.         {
  42.             depth[d]=depth[node]+1;
  43.             blift[d][0]=node;
  44.             dfs(d);
  45.         }
  46.     }
  47. }
  48.  
  49. void binarylifting()
  50. {
  51.     for(ll j=1; j<=lg; j++)
  52.     {
  53.         for(ll i=1; i<=n; i++)
  54.         {
  55.             if(blift[i][j-1]!=-1)
  56.             {
  57.                 ll par = blift[i][j-1];
  58.  
  59.                 blift[i][j] = blift[par][j-1];
  60.             }
  61.         }
  62.     }
  63. }
  64.  
  65. ll lca(ll a,ll b)
  66. {
  67.     if(depth[a]<depth[b]) swap(a,b);
  68.  
  69.     ll k=depth[a]-depth[b];
  70.  
  71.     for(ll j=lg-1; j>=0; j--)
  72.     {
  73.         if(k &(1<<j))
  74.         {
  75.             a=blift[a][j];
  76.         }
  77.     }
  78.  
  79.     if(a==b)
  80.     {
  81.         return a;
  82.     }
  83.  
  84.     for(ll j=lg-1; j>=0; j--)
  85.     {
  86.         if(blift[b][j]!=-1 &&  blift[a][j]!=blift[b][j])
  87.         {
  88.             a=blift[a][j];
  89.             b=blift[b][j];
  90.         }
  91.     }
  92.  
  93.     return blift[a][0];
  94. }
  95.  
  96.  
  97. void treeconstruct(ll node,ll b,ll e)
  98. {
  99.     if(b==e)
  100.     {
  101.         tree[node]=a[b];
  102.         return;
  103.     }
  104.     ll left = node*2;
  105.     ll right = left|1ll;
  106.     ll mid=(b+e)/2;
  107.     treeconstruct(left,b,mid);
  108.     treeconstruct(right,mid+1,e);
  109.     tree[node]=tree[left]+tree[right];
  110. }
  111.  
  112. void update(ll node,ll b,ll e,ll i,ll newv)
  113. {
  114.     if(i>e || i<b) return;
  115.     if(b==e)
  116.     {
  117.         tree[node]=newv;
  118.         return;
  119.     }
  120.     ll left = node*2;
  121.     ll right = left|1ll;
  122.     ll mid=(b+e)/2;
  123.     update(left,b,mid,i,newv);
  124.     update(right,mid+1,e,i,newv);
  125.     tree[node]=tree[left]+tree[right];
  126. }
  127.  
  128. ll queries(ll node,ll b,ll e,ll i,ll j)
  129. {
  130.     if(i>e || j<b) return 0;
  131.     if(b>=i && e<=j) return tree[node];
  132.     ll left = node*2;
  133.     ll right = left|1ll;
  134.     ll mid=(b+e)/2;
  135.     ll x=queries(left,b,mid,i,j);
  136.     ll y=queries(right,mid+1,e,i,j);
  137.     return x+y;
  138. }
  139.  
  140. void clr()
  141. {
  142.     tim=1;
  143.     for(ll i=0; i<=n+2; i++)
  144.     {
  145.         g[i].clear();
  146.         depth[i]=0;
  147.         v[i]=0;
  148.         val[i]=0;
  149.         for(ll j=0;j<20;j++)
  150.         {
  151.              blift[i][j]=-1;
  152.         }
  153.     }
  154.     //memset(blift,-1,sizeof blift);
  155. }
  156.  
  157. int main()
  158. {
  159.     ios_base::sync_with_stdio(0);
  160.     cin.tie(0);
  161.     cout.tie(0);
  162.  
  163.  
  164.     while(cin>>n && n)
  165.     {
  166.         ll q,m,i,j,k,l,root,ans;
  167.  
  168.         lg=log2(n)+1;
  169.  
  170.         clr();
  171.  
  172.         for(i=2; i<=n; i++)
  173.         {
  174.             cin>>k>>val[i];
  175.             k++;
  176.             g[i].push_back(k);
  177.             g[k].push_back(i);
  178.         }
  179.  
  180.         eulerpath(1);
  181.         memset(v,0,sizeof v);
  182.         dfs(1);
  183.         binarylifting();
  184.  
  185.         for(i=1; i<=n; i++)
  186.         {
  187.             a[st[i]]=val[i];
  188.             a[fn[i]]=-val[i];
  189.         }
  190.  
  191.         treeconstruct(1,1,2*n);
  192.  
  193.         cin>>q;
  194.  
  195.         while(q--)
  196.         {
  197.             cin>>j>>k;
  198.  
  199.             j++,k++;
  200.  
  201.             if(st[j]>st[k]) swap(j,k);
  202.  
  203.             root=lca(j,k);
  204.  
  205.             ll j1=queries(1,1,2*n,st[root],st[j]);
  206.             ll k1=queries(1,1,2*n,st[root],st[k]);
  207.  
  208.             ans = j1 + k1 - 2*val[root];
  209.  
  210.             if(q) cout<<ans<<" ";
  211.             else cout<<ans<<nl;
  212.         }
  213.     }
  214.  
  215.     get_lost_idiot;
  216. }
  217.  
  218.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement