Advertisement
Guest User

Untitled

a guest
Jun 29th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. vector <vector<int>> graf;
  7. vector<int> height, order, pos, tree;
  8. vector<bool> used;
  9.  
  10. void dfs(int v, int h)
  11. {
  12.     used[v] = true;
  13.     height[v] = h;
  14.     order.push_back(v);
  15.     for (int i = 0; i != graf[v].size(); i++) {
  16.         if (!used[graf[v][i]])
  17.         {
  18.             dfs(graf[v][i], h + 1);
  19.             order.push_back(v);
  20.         }
  21.     }
  22. }
  23.  
  24. void createTree(int i, int l, int r)
  25. {
  26.     if (l == r) {
  27.         tree[i] = order[l];
  28.     }
  29.     else{
  30.         int m = (l + r) / 2;//
  31.         createTree(i + i, l, m);
  32.         createTree(i + i + 1, m + 1, r);
  33.         tree[i] = height[tree[i + i]] < height[tree[i + i + 1]] ? tree[i + i] : tree[i + i + 1];
  34.     }
  35. }
  36.  
  37. int min(int i, int sl, int sr, int l, int r)
  38. {
  39.     if (sl == l && sr == r) {
  40.         return tree[i];
  41.     }
  42.     int sm = (sl + sr) >> 1;
  43.     if (r <= sm) {
  44.         return min(i + i, sl, sm, l, r);
  45.     }
  46.     if (l > sm) {
  47.         return min(i + i + 1, sm + 1, sr, l, r);
  48.     }
  49.     int ans1 = min(i + i, sl, sm, l, sm);
  50.     int ans2 = min(i + i + 1, sm + 1, sr, sm + 1, r);
  51.     return height[ans1] < height[ans2] ? ans1 : ans2;
  52. }
  53.  
  54. int main()
  55. {
  56.     freopen("input.txt", "r", stdin);
  57.     freopen("output.txt", "w", stdout);
  58.     int n;
  59.     cin >> n;
  60.     graf.resize(n);
  61.     int a, b;
  62.     for (int i = 0; i < n - 1; i++) {
  63.         cin >> a;
  64.         cin >> b;
  65.         graf[a - 1].push_back(b - 1);
  66.         graf[b - 1].push_back(a - 1);
  67.     }
  68.  
  69.     height.resize(n);//
  70.     used.resize(n);
  71.     dfs(0, 1);
  72.     tree.assign(order.size() * 4 + 1, -1);
  73.     createTree(1, 0, order.size() - 1);
  74.     pos.assign(n, -1);
  75.     for (int i = 0; i < order.size(); ++i)
  76.     {
  77.         if (pos[order[i]] == -1) {
  78.             pos[order[i]] = i;
  79.         }
  80.     }
  81.  
  82.         cin >> a;
  83.         cin >> b;
  84.         while (a != -1) {
  85.             int left = pos[a - 1],
  86.                 right = pos[b - 1];
  87.             if (left > right) { swap(left, right); }
  88.             cout << min(1, 0, order.size() - 1, left, right) + 1 << endl;
  89.             a = -1;
  90.             cin >> a;
  91.             cin >> b;
  92.         }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement