Advertisement
Manioc

QTRRE2

May 1st, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 10007
  3. #define LOG 20
  4.  
  5. using namespace std;
  6. typedef long long ll;
  7. typedef pair<int, int> ii;
  8.  
  9. int parent[LOG][MAX];
  10. int level[MAX], vis[MAX], dist[MAX],n;
  11. vector<ii> graph[MAX];
  12.  
  13. void dfs(int no){
  14.     vis[no] = true;
  15.  
  16.     for(int v = 0; v < graph[no].size(); v++){
  17.         int folha = graph[no][v].first;
  18.         if(!vis[folha]){
  19.             level[folha] = level[no] + 1;
  20.             parent[0][folha] = no;
  21.             dist[folha] = dist[no] + graph[no][v].second;
  22.             dfs(folha);
  23.         }
  24.     }
  25. }
  26.  
  27. void build(int no){
  28.     parent[0][no] = no;
  29.     for(int i = 1; (1 << i) <= n; i++){
  30.         for(int j = 1; j <= n; j++){
  31.             if(parent[i-1][j]) parent[i][j] = parent[i-1][parent[i-1][j]];
  32.             //dist[i][j] = dist[i-1][j] + dist[i-1][parent[i-1][j]];
  33.         }
  34.     }
  35. }
  36.  
  37. int lca(int u, int v){
  38.     if(level[u] < level[v]) swap(u, v);
  39.  
  40.     int lg;
  41.     for(lg = 1; (1 << lg) <= level[u]; lg++);
  42.     for(int i = lg-1; i >= 0; i--){
  43.         if(level[u]-(1 << i) >= level[v]){
  44.             //sum += dist[i][u];
  45.             u = parent[i][u];
  46.         }
  47.     }
  48.  
  49.     if(u == v) return u;
  50.  
  51.     for(int i = lg-1; i >= 0; i--){
  52.         if(parent[i][u] != parent[i][v]){
  53.             //sum += dist[i][u] + dist[i][v];
  54.             u = parent[i][u];
  55.             v = parent[i][v];
  56.         }
  57.     }
  58.  
  59.     //sum += dist[0][u] + dist[0][v];
  60.     //cout << sum << endl;
  61.     return parent[0][u];
  62. }
  63.  
  64. int find(int a, int c){
  65.     int lg;
  66.     for(lg = 1; (1 << lg) <= level[a]; lg++)
  67.     for(int i = lg-1; i >= 0; i--){
  68.         if(level[a]-(1 << i) >= c){
  69.             a = parent[i][a];
  70.         }
  71.     }
  72.  
  73.     return a;
  74. }
  75.  
  76. void clear(){
  77.     memset(parent, 0, sizeof parent);
  78.     memset(vis, 0, sizeof vis);
  79.     memset(level, 0, sizeof level);
  80.     for(int i = 0; i <= n; i++) {
  81.         graph[i].clear();
  82.         dist[i] = 0;
  83.     }
  84. }
  85. int main(){
  86.     int t; scanf("%d", &t);
  87.     while(t--){
  88.         scanf("%d", &n);
  89.         clear();
  90.         for(int i = 0; i < n-1; i++){
  91.             int a, b, c; scanf("%d %d %d", &a, &b, &c);
  92.             graph[a].push_back(make_pair(b,c));
  93.             graph[b].push_back(make_pair(a, c));
  94.         }
  95.    
  96.  
  97.         dfs(1); build(1);
  98.         //for(int i = 1; i <= n; i++) cout << level[i] << " ";
  99.         //cout << endl;
  100.         char type[10];
  101.         while(true){
  102.             scanf("%s", type);
  103.  
  104.             if(type[1] == 'O') break;
  105.             int a, b; scanf("%d %d", &a, &b);
  106.             int incesto = lca(a, b);
  107.  
  108.             if(type[1] == 'I'){
  109.                 //cout << "osh\n";
  110.                 printf("%d\n", dist[a]+dist[b]-2*dist[incesto]);
  111.             }else if(type[1] == 'T'){
  112.                 int c; scanf("%d", &c);
  113.                 int dif = level[a]-level[incesto]+1;
  114.  
  115.                 //cout << dif << endl;
  116.                 //cout << level[incesto] << " " << level[a] << endl;
  117.                 if(dif >= c ){
  118.                     //cout << level[a]-c << endl;
  119.                     printf("%d\n", find(a,level[a]-c+1));
  120.                 }else {
  121.                     //cout << level[incesto]+c-dif << endl;
  122.                     printf("%d\n", find(b, 2*level[incesto]+c-level[a]-1));
  123.                 }
  124.             }
  125.         }
  126.         printf("\n");
  127.     }
  128.     return 0;
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement