Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #define debug(l) cerr<<#l<<' '<<l<<'\n';
- #include "bits/stdc++.h"
- using namespace std;
- #define all(a) a.begin(), a.end()
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- typedef long double ld;
- struct Node {
- unordered_map<int, int> clrs; // кол во вершин с цветом key
- unordered_map<int, int> cnt; // кол во цветов которые имеют i вершин в поддереве
- };
- vector<vector<int>> gr;
- vector<int> color;
- vector<Node> sub;
- struct query {
- int k, ind;
- };
- vector<vector<query>> q;
- vector<int> ans;
- void dfs(int v, int p) {
- sub[v].clrs[color[v]]++;
- sub[v].cnt[1]++;
- for (int& u : gr[v]) {
- if (u != p) {
- dfs(u, v);
- if (sub[v].clrs.size() < sub[u].clrs.size())sub[v].clrs.swap(sub[u].clrs),sub[v].cnt.swap(sub[u].cnt);
- for (auto& i : sub[u].clrs) {
- if (sub[v].clrs.find(i.first) != sub[v].clrs.end()) {
- sub[v].cnt[sub[v].clrs[i.first]]--;
- }
- sub[v].clrs[i.first] += i.second;
- sub[v].cnt[sub[v].clrs[i.first]]++;
- }
- sub[u].clrs.clear();
- sub[u].cnt.clear();
- }
- }
- for (query& i : q[v]) {
- int res = 0;
- for (auto& it : sub[v].cnt) {
- if (it.first >= i.k) {
- res += it.second;
- }
- }
- ans[i.ind] = res;
- }
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- int n, m;
- cin >> n >> m;
- color.resize(n), gr.resize(n), sub.resize(n), q.resize(n), ans.resize(m);
- for (int i = 0; i < n; i++) {
- cin >> color[i];
- }
- for (int i = 0; i < n - 1; i++) {
- int u, v;
- cin >> u >> v;
- u--, v--;
- gr[v].push_back(u);
- gr[u].push_back(v);
- }
- for (int i = 0; i < m; i++){
- int v, k;
- cin >> v >> k;
- v--;
- q[v].push_back({ k,i });
- }
- dfs(0, -1);
- for (int& i : ans) {
- cout << i << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement