Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#pragma GCC optimize("Ofast")
- #include <iostream>
- #include <set>
- #include <vector>
- using namespace std;
- set<int> **s;
- int *ans;
- vector<vector<int>> t;
- void dfs(int v) {
- for(int k : t[v]) {
- dfs(k);
- if(s[v] -> size() > s[k] -> size()) {
- for(int i : *s[k]) {
- s[v] -> insert(i);
- }
- delete s[k];
- } else {
- for(int i : *s[v]) {
- s[k] -> insert(i);
- }
- delete s[v];
- s[v] = s[k];
- }
- }
- ans[v] = s[v] -> size();
- }
- int main() {
- int n;
- cin >> n;
- s = new set<int>*[n];
- ans = new int[n];
- t.resize(n);
- int p, c, root;
- for (int i = 0; i < n; i++) {
- cin >> p >> c;
- s[i] = new set<int>;
- s[i] -> insert(c);
- if (p != 0) {
- t[p - 1].push_back(i);
- } else {
- root = i;
- }
- }
- dfs(root);
- delete s[root];
- for (int i = 0; i < n; i++) {
- cout << ans[i] << " ";
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement