Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN = 3e5 + 10;
- vector <int> sons[MAXN];
- vector < pair<int, int> > r[MAXN];
- int r_ans[MAXN];
- int parent[MAXN], ans[MAXN], sz[MAXN];
- bitset<MAXN> used;
- void mergeLocal(vector <int> &a, vector <int> &b) {
- int s1 = a.size(), s2 = b.size();
- for (int i = 0; i < s2; i++) {
- a[s1 - (s2 - i)] += b[i];
- }
- }
- int dfs(int v) {
- sz[v] = 1;
- for (auto &u : sons[v]) {
- sz[v] += dfs(u);
- }
- return sz[v];
- }
- signed main() {
- freopen("input.txt", "r", stdin);
- int n;
- cin >> n;
- parent[1] = -1;
- for (int i = 2; i <= n; i++) {
- int v;
- cin >> v;
- parent[i] = v;
- sons[v].push_back(i);
- }
- int lists = 0;
- for (int i = 1; i <= n; i++) {
- if (sons[i].size() == 0) {
- lists++;
- }
- }
- vector <int> ans_v[lists];
- int a = 0;
- for (int i = 1; i <= n; i++) {
- if (sons[i].size() == 0) {
- ans[i] = a++;
- ans_v[ans[i]].push_back(1);
- }
- }
- int root = 1;
- dfs(root);
- int q;
- cin >> q;
- for (int i = 0; i < q; i++) {
- int v, h;
- cin >> v >> h;
- r[v].push_back(make_pair(h, i));
- }
- deque <int> d;
- for (int i = 1; i <= n; i++) {
- if (sons[i].size() == 0) {
- d.push_back(i);
- }
- }
- while (!d.empty()) {
- int v = d.front();
- d.pop_front();
- int mx = -1;
- for (auto &u : sons[v]) {
- if (mx == -1 || sz[u] > sz[mx]) {
- mx = u;
- }
- }
- if (mx != -1) {
- ans[v] = ans[mx];
- for (auto &u : sons[v]) {
- if (u != mx) {
- mergeLocal(ans_v[ans[v]], ans_v[ans[u]]);
- }
- }
- ans_v[ans[v]].push_back(1);
- }
- for (auto &p : r[v]) {
- int h = p.first, id = p.second;
- if (h >= ans_v[ans[v]].size()) {
- r_ans[id] = 0;
- } else {
- r_ans[id] = ans_v[ans[v]][ans_v[ans[v]].size() - h - 1];
- }
- }
- if (parent[v] != -1 && !used[parent[v]]) {
- d.push_back(parent[v]);
- used[parent[v]] = true;
- }
- }
- for (int i = 0; i < q; i++) {
- cout << r_ans[i] << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement