Submission #607155

#TimeUsernameProblemLanguageResultExecution timeMemory
607155jhwest2Regions (IOI09_regions)C++14
95 / 100
8036 ms73788 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 202020; const int MAXR = 25252; typedef long long ll; int n, r, q, R[MAXN], P[MAXN], X[MAXN]; vector<int> G[MAXN]; vector<int> V[MAXR], W[MAXR]; map<pair<int, int>, ll> M; struct PST { vector<int> tree, l, r; int new_node() { tree.push_back(0); l.push_back(0); r.push_back(0); return (int)tree.size() - 1; } int init(int lo, int hi) { int idx = new_node(); if (lo != hi) { int ll = init(lo, lo + hi >> 1); int rr = init(1 + (lo + hi >> 1), hi); l[idx] = ll; r[idx] = rr; } return idx; } int update(int s, int x, int lo, int hi, int p_idx) { int idx = new_node(); if (lo == hi) { tree[idx] = tree[p_idx] + x; return idx; } int mid = (lo + hi >> 1); int ll = (s <= mid) ? update(s, x, lo, mid, l[p_idx]) : l[p_idx]; int rr = (s > mid) ? update(s, x, mid + 1, hi, r[p_idx]) : r[p_idx]; l[idx] = ll; r[idx] = rr; return idx; } int get() { return tree.size(); } int query(int s, int lo, int hi, int idx) { if (lo == hi) return tree[idx]; int mid = (lo + hi >> 1); if (s <= mid) return query(s, lo, mid, l[idx]); else return query(s, mid + 1, hi, r[idx]); } } PST; int p, LL[MAXN], RR[MAXN]; void dfs(int v) { LL[v] = ++p; for (int x : G[v]) dfs(x); RR[v] = p; } int main() { cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> r >> q; cin >> R[1]; V[R[1]].push_back(1); for (int i = 2; i <= n; i++) { cin >> P[i] >> R[i]; G[P[i]].push_back(i); V[R[i]].push_back(i); } PST.init(1, r); for (int i = 1; i <= n; i++) { X[i] = PST.get(); PST.update(R[i], 1, 1, r, X[P[i]]); } dfs(1); for (int i = 1; i <= n; i++) { W[R[i]].push_back(LL[i]); } for (int i = 1; i <= r; i++) { sort(W[i].begin(), W[i].end()); } while (q--) { int a, b; cin >> a >> b; if (M.find({ a, b }) != M.end()) { cout << M[{a, b}] << endl; continue; } ll ans = 0; if (V[a].size() <= V[b].size()) { for (int x : V[a]) { ans += upper_bound(W[b].begin(), W[b].end(), RR[x]) - lower_bound(W[b].begin(), W[b].end(), LL[x]); } } else { for (int x : V[b]) { ans += PST.query(a, 1, r, X[x]); } } M[{a, b}] = ans; cout << ans << endl; } }

Compilation message (stderr)

regions.cpp: In member function 'int PST::init(int, int)':
regions.cpp:25:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |             int ll = init(lo, lo + hi >> 1);
      |                               ~~~^~~~
regions.cpp:26:35: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   26 |             int rr = init(1 + (lo + hi >> 1), hi);
      |                                ~~~^~~~
regions.cpp: In member function 'int PST::update(int, int, int, int, int)':
regions.cpp:37:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |         int mid = (lo + hi >> 1);
      |                    ~~~^~~~
regions.cpp: In member function 'int PST::query(int, int, int, int)':
regions.cpp:47:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   47 |         int mid = (lo + hi >> 1);
      |                    ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...