Advertisement
tumaryui

K_america_gp

Mar 1st, 2020
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define pb push_back
  4.  
  5. using namespace std;
  6. const int N = 2e5 + 10;
  7. vector<int> gr[N];
  8.  
  9. int p[19][N], timer, tin[N], tout[N],n, q, d[N];
  10.  
  11. void dfs(int v, int pr, int ds = 0) {
  12.     tin[v] = timer++;
  13.     p[0][v] = pr;
  14.     d[v] = ds;
  15.     for(int i = 1; i <= 19; i++) {
  16.         p[i][v] = p[i - 1][p[i - 1][v]];
  17.     }
  18.     for(auto it: gr[v]) {
  19.         if(it != pr) dfs(it, v, ds + 1);
  20.     }
  21.     tout[v] = timer;       
  22. }
  23.  
  24. bool upper(int a, int b) {
  25.     return tin[a] <= tin[b] && tout[a] >= tout[b];
  26. }
  27.  
  28. int lca(int a, int b) {
  29.     if(upper(a, b)) return a;
  30.     if(upper(b, a)) return b;
  31.  
  32.     for(int i = 19; i >= 0; i--) {
  33.         if(!upper(p[i][a], b)) {
  34.             a = p[i][a];
  35.         }
  36.     }
  37.     return p[0][a];
  38. }
  39.  
  40. int len(int a, int b) {
  41.     return d[a] + d[b] - 2 * d[lca(a, b)];
  42. }
  43. main() {
  44.     cin >> n >> q;
  45.     for(int i = 1; i < n; i++) {
  46.         int l, r;
  47.         cin >> l >> r;
  48.         gr[l].pb(r);
  49.         gr[r].pb(l);
  50.     }
  51.     dfs(1, 1);
  52.  
  53.     while(q--) {
  54.         int l, r;
  55.         cin >> l >> r;
  56.         int dist = len(l, r) + 1;
  57.         cout << dist * (dist + 1) / 2 + n - dist << endl;
  58.     }
  59.  
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement