Submission #1201973

#TimeUsernameProblemLanguageResultExecution timeMemory
1201973NikoBaoticRegions (IOI09_regions)C++20
12 / 100
3159 ms196608 KiB
#include "bits/stdc++.h"

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;

#define all(x) x.begin(), x.end()
#define sz(x) ((int) ((x).size()))
#define pb push_back
#define F first
#define S second
#define FIO ios_base::sync_with_stdio(false); cin.tie(0)

const int N = 200100;
const int R = 25000;
const int off = 1 << 18;

struct node {
	int val, lazy;
	node *l, *r;

	node(int _val) : val(_val) {
		lazy = 0;
		l = nullptr;
		r = nullptr;
	}
};

void prop(node *no, int x, int y) {
	if (no == nullptr) return;

	no->val += no->lazy;

	if (x != y and no->lazy) {
		if (no->l == nullptr) no->l = new node(0);
		if (no->r == nullptr) no->r = new node(0);

		no->l->lazy += no->lazy;
		no->r->lazy += no->lazy;
	}

	no->lazy = 0;
}

node* update(node *no, int l, int r, int delta, int x = 0, int y = off - 1) {
	if (x > r or l > y) return no;
	if (no == nullptr) no = new node(0);

	if (l <= x and y <= r) {
		no->lazy += delta;
		prop(no, x, y);
		return no;
	}

	prop(no, x, y);

	no->l = update(no->l, l, r, delta, x, (x + y) / 2);
	no->r = update(no->r, l, r, delta, (x + y) / 2 + 1, y);
	
	no->val = 0;

	if (no->l != nullptr) no->val += no->l->val;
	if (no->r != nullptr) no->val += no->r->val;

	return no;
}

int query(node *no, int tar, int x = 0, int y = off - 1) {
	if (no == nullptr) return 0;

	if (x > tar or tar > y) return 0;

	prop(no, x, y);

	if (tar == x and y == tar) return no->val;

	return query(no->l, tar, x, (x + y) / 2) + query(no->r, tar, (x + y) / 2 + 1, y);
}

int n, r, q;
int h[N];
int par[N];
vector<int> chi[N];
vector<int> emp[R];
node* tr[R];
int in[N];
int out[N];
int timer;

void dfs(int node) {
	timer++;
	in[node] = timer;

	for (int u : chi[node]) {
		dfs(u);
	}

	out[node] = timer;
}

int main() {
	FIO;

	cin >> n >> r >> q;
	
	for (int i = 1; i <= n; i++) {
		if (i != 1) {
			cin >> par[i];

			chi[par[i]].pb(i);
		}

		cin >> h[i];

		emp[h[i]].pb(i);
	}

	for (int i = 1; i <= r; i++) {
		tr[i] = new node(0);
	}

	dfs(1);

	for (int i = 1; i <= n; i++) {
		update(tr[h[i]], in[i], out[i], 1);
	}

	for (int i = 0; i < q; i++) {
		int r1, r2;
		cin >> r1 >> r2;

		int ans = 0;

		for (int x : emp[r2]) {
			ans += query(tr[r1], in[x]);
		}

		cout << ans << endl;
	}

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...