Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // #pragma GCC optimize("Ofast")
- #include <bits/stdc++.h>
- #ifdef Local
- #include "debug/debug.h"
- #else
- #define debug(...)
- #endif
- typedef long long ll;
- typedef long double ld;
- #define int ll
- #define vec vector
- #define str string
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define sz(x) (int)(x).size()
- #define pb push_back
- using namespace std;
- static const int N = 1024 * 1024;
- namespace ft {
- int tree[N + 1];
- void add(int i, int d = 1) {
- for (; i <= N; i += i & -i)
- tree[i] += d;
- }
- int sum(int r) {
- int res = 0;
- for (; r > 0; r -= r & -r)
- res += tree[r];
- return res;
- }
- } // namespace ft
- struct query {
- int v, l, r;
- };
- vec<int> g[N];
- int color[N];
- vec<query> q;
- vec<int> m;
- void dfs(int v) {
- m.pb(color[v]);
- q[v].l = sz(m) - 1;
- q[v].v = v;
- for (int& u : g[v])
- dfs(u);
- q[v].r = sz(m) - 1;
- }
- void solve() {
- int n;
- cin >> n;
- int st = 0;
- for (int v = 0, p, c; v < n; v++) {
- cin >> p >> c, p--;
- color[v] = c;
- if (p >= 0)
- g[p].pb(v);
- else
- st = v;
- }
- q.resize(n);
- dfs(st);
- vec<int> ans(n, 0);
- vec<int> b(n + 1, -1);
- vec<int> c(n + 1, -1);
- sort(all(q), [&](query a, query b) { return a.l < b.l; });
- vec<query> t = q;
- sort(all(t), [&](query a, query b) { return a.r < b.r; });
- for (int l = 0, i = 0, j = 0; l < n; l++) {
- b[l] = c[m[l]], c[m[l]] = l;
- ft::add(b[l] + 2);
- debug(b[l]);
- for (; i < n && q[i].l == l; i++)
- ans[q[i].v] -= ft::sum(q[i].l + 1);
- for (; j < n && t[j].r == l; j++)
- ans[t[j].v] += ft::sum(t[j].l + 1);
- }
- for (int& i : ans)
- cout << i + 1 << ' ';
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int tt = 1;
- // cin >> tt;
- while (tt--)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement