Advertisement
Guest User

Untitled

a guest
Jun 5th, 2016
311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define INF INT_MAX/2
  6. #define ll long long
  7. #define mp make_pair
  8.  
  9. const int MAXN = 300000 + 7;
  10. int t[4 * MAXN], d[4 * MAXN], a[MAXN];
  11. int first[MAXN], last[MAXN];
  12. int sz = 0;
  13. vector <int> g[MAXN];
  14.  
  15. void push(int v, int l, int r) {
  16.     t[v * 2 + 1] += d[v];
  17.     t[v * 2 + 2] += d[v];
  18.     d[v * 2 + 1] += d[v];
  19.     d[v * 2 + 2] += d[v];
  20.     d[v] = 0;
  21. }
  22.  
  23. int get(int v, int l, int r, int tl, int tr) {
  24.     if (tl >= r || tr <= l) {
  25.         return INF;
  26.     } else if (tl >= l && tr <= r) {
  27.         return t[v];
  28.     } else {
  29.         push(v, tl, tr);
  30.         int tm = (tl + tr) / 2;
  31.         return min(get(v * 2 + 1, l, r, tl, tm), get(v * 2 + 2, l, r, tm, tr));
  32.     }
  33. }
  34.  
  35. void upd(int v, int l, int r, int tl, int tr, int x) {
  36.     if (l >= r) {
  37.         return;
  38.     }
  39.     if (tl >= r || tr <= l) {
  40.         return;
  41.     } else if (tl >= l && tr <= r) {
  42.         t[v] += x;
  43.         d[v] += x;
  44.     } else {
  45.         push(v, tl, tr);
  46.         int tm = (tl + tr) / 2;
  47.         upd(v * 2 + 1, l, r, tl, tm, x);
  48.         upd(v * 2 + 2, l, r, tm, tr, x);
  49.         t[v] = min(t[v * 2 + 1], t[v * 2 + 2]);
  50.     }
  51. }  
  52.  
  53. void dfs(int v, int h) {
  54.     first[v] = sz;
  55.     last[v] = sz;
  56.     a[sz] = h;
  57.     sz++;
  58.     for (int i = 0; i < (int) g[v].size(); i++) {
  59.         dfs(g[v][i], h + 1);
  60.         last[v] = sz;
  61.         a[sz] = h;
  62.         sz++;
  63.     }  
  64. }  
  65.  
  66. void build(int v, int l, int r) {
  67.     if (r - l == 1) {
  68.         t[v] = a[l];
  69.     } else {
  70.         int m = (l + r) / 2;
  71.         build(v * 2 + 1, l, m);
  72.         build(v * 2 + 2, m, r);
  73.         t[v] = min(t[v * 2 + 1], t[v * 2 + 2]);
  74.     }
  75. }
  76.  
  77. int main() {
  78.     ios_base::sync_with_stdio(0);
  79.     //freopen("input.txt", "r", stdin);
  80.     //freopen("output.txt", "w", stdout);
  81.     int n, p, q, u, v, t;
  82.     cin >> n;
  83.     for (int i = 2; i <= n; i++) {
  84.         cin >> p;
  85.         g[p].push_back(i);
  86.     }
  87.     dfs(1, 0);
  88.     build(0, 0, sz);
  89.     cin >> q;
  90.     while (q--) {
  91.         cin >> t;
  92.         if (t == 1) {
  93.             cin >> u >> v;
  94.             int lca = get(0, min(first[u], last[v]), max(first[u], last[v]) + 1, 0, sz);
  95.             int h_u = get(0, first[u], first[u] + 1, 0, sz);
  96.             int h_v = get(0, first[v], first[v] + 1, 0, sz);
  97.             cout << h_u - lca + h_v - lca << endl;
  98.         } else {
  99.             cin >> v;
  100.             upd(0, first[v] + 1, last[v], 0, sz, -1);
  101.         }
  102.     }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement