Submission #1328104

#TimeUsernameProblemLanguageResultExecution timeMemory
1328104niwradRegions (IOI09_regions)C++20
100 / 100
3164 ms35028 KiB
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;

vector<int> regions;
vector<vector<int>> graph;
int n, r, q;



vector<vector<long long>> counts;
vector<vector<int>> employees;
void pref(vector<long long> &vec, int check, int num, int node) {
    int t = num;
    if (regions[node] == check) {
        t++;
    } else {
        vec[regions[node]] += num;
    }
    for (auto next : graph[node]) {
        pref(vec, check, t, next);
    }
}

map<int, int> big_i;
vector<int> on;
vector<int> off;
vector<vector<long long>> arr;
int t;
void walk(int node) {
    on[node] = t;
    t++;
    arr[regions[node]].push_back(on[node]);
    for (auto next : graph[node]) {
        walk(next);
    }
    t++;
    off[node] = t;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> r >> q;
    regions.resize(n);
    graph.resize(n);
    cin >> regions[0];
    employees.resize(r);
    regions[0]--;
    employees[regions[0]].push_back(0);
    for (int i = 1; i < n; i++) {
        int c;
        cin >> c;
        graph[--c].push_back(i);
        cin >> regions[i];
        employees[--regions[i]].push_back(i);
    }
    for (int i = 0 ; i < r; i++) {
        if (employees[i].size()>= 500) {
            vector<long long> vec(r);
            pref(vec, i, 0, 0);
            big_i[i] = counts.size();
            counts.push_back(vec);
        }
    }
    arr.resize(r); on.resize(n); off.resize(n);
    t = 0;
    walk(0);
    for (int i = 0; i < q; i++) {
        int r1, r2;
        cin >> r1 >> r2;
        r1--; r2--;
        if (employees[r1].size() >= 500) {
            cout << counts[big_i[r1]][r2] << endl;
            cout.flush();
        } else {
            long long sum = 0;
            for (auto val : employees[r1]) {
                sum += lower_bound(arr[r2].begin(), arr[r2].end(), off[val]) - lower_bound(arr[r2].begin(), arr[r2].end(), on[val]);
            }
            cout << sum << endl;
            cout.flush();
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...