Advertisement
skaram

Untitled

Oct 10th, 2022
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. // #pragma GCC optimize("Ofast")
  2. #include <bits/stdc++.h>
  3. #ifdef Local
  4. #include "debug/debug.h"
  5. #else
  6. #define debug(...)
  7. #endif
  8.  
  9. typedef long long ll;
  10. typedef long double ld;
  11.  
  12. #define int ll
  13.  
  14. #define vec vector
  15. #define str string
  16. #define all(x) (x).begin(), (x).end()
  17. #define rall(x) (x).rbegin(), (x).rend()
  18. #define sz(x) (int)(x).size()
  19. #define pb push_back
  20.  
  21. using namespace std;
  22.  
  23. static const int N = 1024 * 1024;
  24.  
  25. namespace ft {
  26. int tree[N + 1];
  27.  
  28. void add(int i, int d = 1) {
  29.     for (; i <= N; i += i & -i)
  30.         tree[i] += d;
  31. }
  32.  
  33. int sum(int r) {
  34.     int res = 0;
  35.     for (; r > 0; r -= r & -r)
  36.         res += tree[r];
  37.     return res;
  38. }
  39. }  // namespace ft
  40.  
  41. struct query {
  42.     int v, l, r;
  43. };
  44.  
  45. vec<int> g[N];
  46. int color[N];
  47. vec<query> q;
  48. vec<int> m;
  49.  
  50. void dfs(int v) {
  51.     m.pb(color[v]);
  52.     q[v].l = sz(m) - 1;
  53.     q[v].v = v;
  54.     for (int& u : g[v])
  55.         dfs(u);
  56.     q[v].r = sz(m) - 1;
  57. }
  58.  
  59. void solve() {
  60.     int n;
  61.     cin >> n;
  62.     int st = 0;
  63.     for (int v = 0, p, c; v < n; v++) {
  64.         cin >> p >> c, p--;
  65.         color[v] = c;
  66.         if (p >= 0)
  67.             g[p].pb(v);
  68.         else
  69.             st = v;
  70.     }
  71.     q.resize(n);
  72.     dfs(st);
  73.     vec<int> ans(n, 0);
  74.     vec<int> b(n + 1, -1);
  75.     vec<int> c(n + 1, -1);
  76.     sort(all(q), [&](query a, query b) { return a.l < b.l; });
  77.     vec<query> t = q;
  78.     sort(all(t), [&](query a, query b) { return a.r < b.r; });
  79.     for (int l = 0, i = 0, j = 0; l < n; l++) {
  80.         b[l] = c[m[l]], c[m[l]] = l;
  81.         ft::add(b[l] + 2);
  82.         debug(b[l]);
  83.         for (; i < n && q[i].l == l; i++)
  84.             ans[q[i].v] -= ft::sum(q[i].l + 1);
  85.         for (; j < n && t[j].r == l; j++)
  86.             ans[t[j].v] += ft::sum(t[j].l + 1);
  87.     }
  88.     for (int& i : ans)
  89.         cout << i + 1 << ' ';
  90. }
  91.  
  92. signed main() {
  93.     ios::sync_with_stdio(false);
  94.     cin.tie(nullptr);
  95.  
  96.     int tt = 1;
  97.     //    cin >> tt;
  98.     while (tt--)
  99.         solve();
  100.  
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement