Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 5;
- vector<int> v[N];
- int colour[N];
- int ret[N];
- vector<pair<int, int>> store[N];
- class DSU
- {
- public:
- vector<map<int, int>> Maps;
- vector<int> MapID;
- int N;
- DSU(int N)
- {
- this -> N = N;
- for(int i = 0; i <= N; i++)
- {
- map<int, int> temp;
- temp[colour[i]] = 1;
- Maps.push_back(temp);
- MapID.push_back(i);
- }
- }
- int getPar(int x)
- {
- return MapID[x];
- }
- int getSize(int x)
- {
- int par = getPar(x);
- return Maps[par].size();
- }
- void unite(int a, int b)
- {
- int par1 = getPar(a);
- int par2 = getPar(b);
- MapID[par2] = par1;
- for(pair<int, int> x : Maps[par2])
- {
- Maps[par1][x.first] += x.second;
- }
- }
- };
- void dfs(DSU & D, int sv, int par)
- {
- int maxChild = 0;
- int bigChild = sv;
- for(int x : v[sv])
- {
- if(x == par)
- {
- continue;
- }
- dfs(D, x, sv);
- int sz = D.getSize(x);
- if(maxChild < sz)
- {
- maxChild = sz;
- bigChild = x;
- }
- }
- for(int x : v[sv])
- {
- if(x == par or x == bigChild)
- {
- continue;
- }
- D.unite(bigChild, x);
- }
- if(bigChild != sv)
- {
- D.unite(bigChild, sv);
- }
- for(pair<int, int> x : store[sv])
- {
- ret[x.second] = D.Maps[sv][x.first];
- }
- }
- int32_t main()
- {
- ios_base:: sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- int n, root, query;
- cin >> n >> query >> root;
- for(int i = 0; i < n - 1; i++)
- {
- int a, b;
- cin >> a >> b;
- v[a].push_back(b);
- v[b].push_back(a);
- }
- for(int i = 1; i <= n; i++)
- {
- cin >> colour[i];
- }
- DSU D(n);
- for(int i = 1; i <= query; i++)
- {
- int node, colour;
- cin >> node >> colour;
- store[node].push_back({colour, i});
- }
- dfs(D, root, 0);
- for(int i = 1; i <= n; i++)
- {
- cout << ret[i] << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement