Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include "optimization.h"
  3. using namespace std;
  4. const long long N = 1e6 + 2;
  5.  
  6. long long t[4 * N + 2];
  7. long long level[N];
  8. long long n, m, q, l, r, timer, x;
  9.  
  10. struct T {
  11.     long long l, r, id;
  12.     bool operator<(T q) {
  13.         if (r == q.r)
  14.             return l < q.l;
  15.         return r < q.r;
  16.     }
  17. };
  18.  
  19. vector<T> Q;
  20. vector<long long> ans;
  21. vector<long long> pr;
  22. long long a[N];
  23. long long pred[N];
  24. long long t_in[N];
  25. long long t_out[N];
  26. vector<long long> g[N];
  27. long long color[N];
  28. long long used[N];
  29.  
  30.  
  31. void dfs(long long v) {
  32.     used[v] = 1;
  33.     timer++;
  34.     a[timer] = color[v];
  35.     t_in[v] = timer;
  36.         for(size_t i = 0; i < g[v].size(); i++) {
  37.             long long to = g[v][i];
  38.             if (!used[to]) dfs(to);
  39.         }
  40.     t_out[v] = timer;
  41. }
  42.  
  43. struct SegTree {
  44.     void set(long long i, int x) {
  45.         t[i += n] += x;
  46.         for (i /= 2; i >= 1; i /= 2)
  47.             t[i] = t[2 * i] + t[2 * i + 1];
  48.     }
  49.  
  50.     int count(int l, int r) {
  51.         long long res = 0;
  52.         for (l += n, r += n; l <= r; l /= 2, r /= 2) {
  53.             if (l % 2 == 1) res += t[l++];
  54.             if (r % 2 == 0) res += t[r--];
  55.         }
  56.         return res;
  57.     }
  58. };
  59.  
  60. SegTree tree;
  61.  
  62. int main() {
  63.    
  64.     n = readInt(); 
  65.     pr.resize(n + 1);
  66.    
  67.     long long rt, c, p;
  68.     for (int i = 1; i <= n; i++) {
  69.         p = readInt(), c = readInt();
  70.         rt = (p == 0) ? i : rt;
  71.         g[p].push_back(i);
  72.         color[i] = c;
  73.         pr[i] = -1;
  74.     }
  75.    
  76.     dfs(rt);
  77.    
  78.     for (int i = 1; i <= n; i++) {
  79.         pred[i] = pr[a[i]];
  80.         pr[a[i]] = i;
  81.     }
  82.    
  83.     ans.resize(n + 1);
  84.     for (int i = 1; i <= n; i++) {
  85.         Q.push_back({t_in[i], t_out[i], i});
  86.     }
  87.    
  88.     sort(Q.begin(), Q.end());
  89.    
  90.     int pos = 1;
  91.     for (size_t i = 0; i < Q.size(); i++) {
  92.         while(pos <= Q[i].r) {
  93.             if (pred[pos] != -1)
  94.                 tree.set(pred[pos], -1);
  95.             tree.set(pos, 1);
  96.             pos++;
  97.         }
  98.         ans[Q[i].id] = tree.count(Q[i].l, Q[i].r);
  99.     }
  100.     for (long long i = 1; i <= n; i++)
  101.         writeInt<long long>(ans[i], ' ');
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement