Submission #1250325

#TimeUsernameProblemLanguageResultExecution timeMemory
1250325kunzaZa183Regions (IOI09_regions)C++20
50 / 100
489 ms196608 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
  int n, r, q;
  cin >> n >> r >> q;
  vector<int> region(n);
  vector<vector<int>> regions(r);
  cin >> region[0];
  region[0]--;
  regions[region[0]].push_back(0);
  vector<vector<int>> adj(n);
  for (int i = 1; i < n; i++) {
    int x;
    cin >> x;
    adj[x - 1].push_back(i);
    cin >> region[i];
    region[i]--;
    regions[region[i]].push_back(i);
  }

  vector<int> in(n), out(n);
  int ct = 0;
  function<void(int)> dfs = [&](int cur) {
    in[cur] = ct;
    for (auto a : adj[cur])
      dfs(a);
    out[cur] = ct++;
  };
  dfs(0);

  int k = sqrt(n / log2(n));

  vector<vector<int>> coef(r);
  vector<vector<ll>> ans(r);

  for (int i = 0; i < r; i++) {
    if (regions[i].size() >= k) {
      coef[i].resize(n + 1);
      ans[i].resize(r);

      for (auto a : regions[i])
        coef[i][in[a]]++, coef[i][out[a]]--;

      for (int j = 1; j <= n; j++)
        coef[i][j] += coef[i][j - 1];

      for (int j = 0; j < n; j++)
        ans[i][region[j]] += coef[i][out[j]];
    }
  }

  vector<vector<int>> indexs(r);

  for (int i = 0; i < n; i++) {
    indexs[region[i]].push_back(out[i]);
  }

  for (auto &a : indexs)
    sort(begin(a), end(a));

  while (q--) {
    int a, b;
    cin >> a >> b;
    a--, b--;

    if (regions[a].size() >= k) {
      cout << ans[a][b] << endl;
    } else {
      int res = 0;
      for (auto x : regions[a])
        res += upper_bound(begin(indexs[b]), end(indexs[b]), out[x]) -
               lower_bound(begin(indexs[b]), end(indexs[b]), in[x]);
      cout << res << endl;
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...