제출 #1339261

#제출 시각아이디문제언어결과실행 시간메모리
1339261becastalRegions (IOI09_regions)C++20
100 / 100
3418 ms50088 KiB
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);
#define endl '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
typedef long long ll;
using namespace std;
#define int ll

struct Bit {
	int n;
	vector<int> F;

	Bit(int n_) : n(n_), F(n+1) {};
	void update(int i, int x) {
		for (i++; i <= n; i+=i&-i) {
			F[i] += x;
		}
	}

	int pref(int i) {
		int res = 0;
		for (i++; i; i-=i&-i) {
			res += F[i];
		}
		return res;
	}
};

int solve() {
	int n, r, q; cin >> n >> r >> q;
	vector<int> Pai(n, -1), Cor(n);
	vector<vector<int>> G(n), OcorU(r), Ocor(r);

	for (int i = 0; i < n; i++) {
		if (i) {
			cin >> Pai[i]; Pai[i]--;
			cin >> Cor[i]; Cor[i]--;
			G[Pai[i]].push_back(i);
		} else {
			cin >> Cor[i]; Cor[i]--;
		}
		OcorU[Cor[i]].push_back(i);
	}

	int t = 0;
	vector<int> L(n), R(n);
	function<void(int)> dfs = [&](int u) {
		Ocor[Cor[u]].push_back(L[u] = t++);
		for (int v : G[u]) {
			dfs(v);
		}
		R[u] = t;
	};
	dfs(0);

	for (int r1 = 0; r1 < r; r1++) {
		sort(all(Ocor[r1]));
	}

	Bit bit(n);
	vector<vector<int>> Res;
	vector<int> Id(r);

	function<void(int, int, int)> dfs2 = [&](int u, int cont_cor, int cor_pai) {
		cont_cor += (Cor[u] == cor_pai);
		Res.back()[Cor[u]] += cont_cor;
		for (int v : G[u]) {
			dfs2(v, cont_cor, cor_pai);
		}
	};

	int RAIZ = ceil(sqrt(n));
	for (int r1 = 0, id = 0; r1 < r; r1++) if ((int)Ocor[r1].size() >= RAIZ) {
		Id[r1] = id++;
		Res.push_back(vector<int>(r));
		dfs2(0, 0, r1);
	}

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

		if ((int)Ocor[r1].size() >= RAIZ) {
			cout << Res[Id[r1]][r2] << endl;
		} else {
			int res = 0;
			for (int u : OcorU[r1]) {
				res += lower_bound(all(Ocor[r2]), R[u]) - lower_bound(all(Ocor[r2]), L[u]);
			}
			cout << res << endl;
		}
		cout << flush;
	}

	return(0);
}

signed main()
{
    //_;

	int t = 1; //cin >> t;
	while (t--) {
		solve();
	}
    
    return(0);
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...