Advertisement
Waliul

SPOJ - QTREE2

Jul 27th, 2020
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define mx 10010
  5. vector<pair<int, int>>adj[mx];
  6. int L[mx], T[mx], P[mx][15], root, cost[mx];
  7. bool vis[mx];
  8.  
  9. void dfs(int from, int u, int dep, int val)
  10. {
  11.     T[u] = from;
  12.     L[u] = dep;
  13.     cost[u] = val;
  14.     for(auto it : adj[u])
  15.     {
  16.         if(it.first == from)
  17.             continue;
  18.         dfs(u, it.first, dep+1, val+it.second);
  19.     }
  20. }
  21.  
  22. void lca_init(int n)
  23. {
  24.     memset(P, -1, sizeof(P));
  25.     for(int i = 1; i <= n; i++)
  26.         P[i][0] = T[i];
  27.  
  28.     for(int j = 1; (1 << j) < n; j++)
  29.         for(int i = 1; i <= n; i++)
  30.         {
  31.             if(P[i][j - 1] != -1)
  32.                 P[i][j] = P[P[i][j - 1]][j - 1];
  33.         }
  34. }
  35.  
  36. int lca_query(int p, int q)
  37. {
  38.     if(L[p] < L[q])
  39.         swap(p, q);
  40.     int log = 1;
  41.     while(1)
  42.     {
  43.         int next = log + 1;
  44.         if((1 << next) > L[p])
  45.             break;
  46.         log++;
  47.     }
  48.  
  49.     for(int i = log; i >= 0; i--)
  50.         if(L[p] - (1 << i) >= L[q])
  51.             p = P[p][i];
  52.     if(p == q)
  53.         return p;
  54.     for(int i = log; i >= 0; i--)
  55.         if(P[p][i] != -1 && P[p][i] != P[q][i])
  56.             p = P[p][i], q = P[q][i];
  57.     return T[p];
  58. }
  59.  
  60. int kth(int nd, int k)
  61. {
  62.     int log = log2(L[nd]);
  63.     for(int i = log; i >= 0; i--)
  64.         if(L[nd] - (1 << i) >= k)
  65.             nd = P[nd][i];
  66.     return nd;
  67. }
  68.  
  69. int main()
  70. {
  71.     int n, p, q, t, i, j, v;
  72.     root = 1;
  73.     scanf("%d", &t);
  74.     while(t--)
  75.     {
  76.         scanf("%d", &n);
  77.         for(i = 1; i < n; i++)
  78.         {
  79.             scanf("%d %d %d", &p, &q, &v);
  80.             adj[p].push_back({q, v});
  81.             adj[q].push_back({p, v});
  82.         }
  83.         dfs(-1, 1, 0, 0);
  84.         lca_init(n);
  85.         char s[10];
  86.         while(1)
  87.         {
  88.             scanf("%s", s);
  89.             if(s[1] == 'O')
  90.                 break;
  91.             scanf("%d %d", &p, &q);
  92.             int l = lca_query(p, q);
  93.             if(s[1] == 'I')
  94.             {
  95.                 int cp, cq, cl;
  96.                 cp = cost[p], cq = cost[q], cl = cost[l];
  97.                 printf("%d\n", cp+cq - 2*cl);
  98.             }
  99.             else
  100.             {
  101.                 scanf("%d", &v);
  102.                 int tt = L[p] - L[l] + 1;
  103.                 if(tt >= v)
  104.                     v = kth(p, L[p] - v + 1);
  105.                 else
  106.                     v = kth(q, 2*L[l] + v - L[p] - 1);
  107.                 printf("%d\n", v);
  108.             }
  109.         }
  110.         puts("");
  111.     }
  112.     return 0;
  113. }
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement