Submission #988431

#TimeUsernameProblemLanguageResultExecution timeMemory
988431orcslopRegions (IOI09_regions)C++17
35 / 100
2727 ms67816 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define pb push_back #define all(x) begin(x), end(x) #define sz(x) (int) (x).size() #define f first #define s second #define mkp make_pair #define pii pair<int, int> const int MAXR = 25005; const int MAXN = 2e5 + 5; const int RT = 450; int n, r, q, timer; int h[MAXN]; int tin[MAXN]; int subs[MAXN]; int pre[RT][MAXN]; int tree[2 * MAXN]; map<int, int> mp; vector<int> adj[MAXN]; vector<int> eul[MAXR], occ[MAXR]; void dfs(int node, int prev){ subs[node] = 1; tin[node] = timer++; for(auto x : adj[node]){ if(x == prev) continue; dfs(x, node); subs[node] += subs[x]; } } int query(int a, int b){ a += n; b += n; int s = 0; while(a <= b){ if(a % 2 == 1) s += tree[a++]; if(b % 2 == 0) s += tree[b--]; a /= 2; b /= 2; } return s; } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> r >> q; cin >> h[0]; occ[h[0]].pb(0); for(int i = 1; i < n; i++){ int x; cin >> x >> h[i]; adj[--x].pb(i); adj[i].pb(x); occ[h[i]].pb(i); } dfs(0, -1); for(int i = 1; i < MAXR; i++){ for(auto x : occ[i]) eul[i].pb(tin[x]); sort(all(eul[i])); sort(all(occ[i]), [](int &a, int &b){ return tin[a] < tin[b]; }); if(occ[i].size() >= RT) { int index = 0; for(int j = 0; j < n; j++){ if(j == occ[i][index]){ tree[j + n] = 1; index++; } else tree[j + n] = 0; } for(int j = n - 1; j >= 0; j--){ tree[j] = tree[2 * j] + tree[2 * j + 1]; } for(int j = 1; j < MAXN; j++){ for(auto x : occ[j]){ pre[mp.size()][j] += query(tin[x], tin[x] + subs[x] - 1); } } mp[i] = mp.size(); } } for(int i = 0; i < q; i++){ int a, b; cin >> a >> b; if(occ[a].size() >= RT) cout << pre[mp[a]][b] << endl; else{ int ans = 0; for(auto x : occ[a]){ // cout << tin[x] << ' ' << tin[x] + subs[x] - 1 << endl; auto lb = lower_bound(all(eul[b]), tin[x]); auto ub = upper_bound(all(eul[b]), tin[x] + subs[x] - 1); ans += ub - lb; } // cout << "______\n"; cout << ans << endl; } } // cout << tin[0] << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...