Submission #1300742

#TimeUsernameProblemLanguageResultExecution timeMemory
1300742tolgaRegions (IOI09_regions)C++20
2 / 100
3253 ms20600 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 5 + 2e5;
vector<int> edges[maxn];
int vert[maxn], tin[maxn], tout[maxn], timer = 0;

void dfs(int u) {
  tin[u] = ++timer;
  for (int v : edges[u])
    dfs(v);
  tout[u] = timer;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);

  int n, r, q;
  cin >> n >> r >> q;

  vector<vector<int>> reg(r + 5);
  cin >> vert[1];
  reg[vert[1]].push_back(1);
  for (int i = 2; i <= n; i++) {
    int par;
    cin >> par;
    edges[par].push_back(i);

    cin >> vert[i];
    reg[vert[i]].push_back(i);
  }

  dfs(1);

  for (int i = 1; i <= r; i++)
    sort(reg[i].begin(), reg[i].end(),
         [](int &a, int &b) { return tin[a] < tin[b]; });

  while (q--) {
    int r1, r2;
    cin >> r1 >> r2;

    auto &v1 = reg[r1], &v2 = reg[r2];
    int ans = 0;

    static auto cmp1 = [](int a, int b) { return tin[a] < tin[b]; };
    static auto cmp2 = [](int a, int b) { return tout[a] < tout[b]; };

    for (int &u : v1) {
      if (v2.back() < tin[u] || v2.back() > tout[u])
        continue;
      int left = lower_bound(v2.begin(), v2.end(), tin[u], cmp1) - v2.begin();
      int right = upper_bound(v2.begin(), v2.end(), tout[u], cmp2) - v2.begin();
      ans += right - left;
    }
    cout << ans << endl;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...