제출 #1213516

#제출 시각아이디문제언어결과실행 시간메모리
1213516vaneaRegions (IOI09_regions)C++20
0 / 100
109 ms26200 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mxN = 2e5+10; const int mxR = 3e4+10; int reg[mxN], st[4*mxN]; vector<int> adj[mxN], emp[mxR]; int tin[mxN], tout[mxN], timer = -1; void dfs(int node, int p) { tin[node] = ++timer; for(auto it : adj[node]) { if(it == p) continue; dfs(it, node); } tout[node] = timer; } void upd(int node, int l, int r, int k, int x) { if(l == r && l == k) { st[node] = x; return ; } if(l > k || r < k) return ; int mid = (l+r)/2; upd(node*2, l, mid, k, x); upd(node*2+1, mid+1, r, k, x); st[node] = st[node*2] + st[node*2+1]; } int qry(int node, int l, int r, int l1, int r1) { if(l1 <= l && r <= r1) return st[node]; if(l1 > r || r1 < l) return 0; int mid = (l+r)/2; return qry(node*2, l, mid, l1, r1) + qry(node*2+1, mid+1, r, l1, r1); } int main() { int n, r, q; cin >> n >> r >> q; cin >> reg[1]; emp[reg[1]].push_back(1); for(int i = 2; i <= n; i++) { int p; cin >> p >> reg[i]; emp[reg[i]].push_back(i); adj[p].push_back(i); adj[i].push_back(p); } dfs(1, 0); vector<vector<array<int, 2>>> queries(mxR); vector<int> ans(q+1); for(int i = 0; i < q; i++) { int r1, r2; cin >> r1 >> r2; array<int, 2> now = {r1, i}; queries[r2].push_back(now); } for(int i = 25000; i >= 1; i--) { for(auto it : emp[i]) { upd(1, 0, timer+1, tin[it], 1); } for(auto [r1, idx] : queries[i]) { int ans1 = 0; for(auto it : emp[r1]) { ans1 += qry(1, 0, timer+1, tin[it], tout[it]); } ans[idx] = ans1; } for(auto it : emp[i]) { upd(1, 0, timer+1, tin[it], 0); } } for(int i = 0; i < q; i++) { cout << ans[i] << '\n'; cout << flush; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...