Submission #1146866

#TimeUsernameProblemLanguageResultExecution timeMemory
1146866AtabayRajabliFountain (eJOI20_fountain)C++20
100 / 100
409 ms24152 KiB
#include <bits/stdc++.h> #define all(v) v.begin(), v.end() using namespace std; const int sz = 1e5 + 5, inf = 1e9 + 7; int n, q, dp[20][sz], sg[sz << 2], cost[sz], dist[sz]; array<int, 2> a[sz]; vector<int> v, g[sz]; int get(int ind, int l, int r, int lx, int rx) { if(l > rx || r < lx) return n + 1; if(lx <= l && r <= rx) return sg[ind]; int mid = (l + r) >> 1; return min(get(ind << 1, l, mid, lx, rx), get(ind << 1 | 1, mid + 1, r, lx, rx)); } void upd(int ind, int l, int r, int x, int val) { if(l == r) { sg[ind] = val; return; } int mid = (l + r) >> 1; if(x <= mid) upd(ind << 1, l, mid, x, val); else upd(ind << 1 | 1, mid + 1, r, x, val); sg[ind] = min(sg[ind << 1], sg[ind << 1 | 1]); } int id(int i) { return upper_bound(all(v), i) - v.begin(); } void dfs(int v) { for(int i : g[v]) { dist[i] = dist[v] + 1; cost[i] = cost[v] + a[i][1]; dfs(i); } } void solve() { cin >> n >> q; for(int i = 1; i <= n; i++) { upd(1, 1, n, i, n + 1); cin >> a[i][0] >> a[i][1]; v.push_back(a[i][0]); } v.push_back(inf); sort(all(v)); v.erase(unique(all(v)), v.end()); upd(1, 1, n, v.size(), n + 1); for(int i = n; i >= 1; i--) { int ix = id(a[i][0]); dp[0][i] = get(1, 1, n, ix + 1, v.size()); g[dp[0][i]].push_back(i); upd(1, 1, n, ix, i); } dp[0][n + 1] = n + 1; for(int i = 1; i < 20; i++) { for(int j = 1; j <= n + 1; j++) { dp[i][j] = dp[i - 1][dp[i - 1][j]]; } } dfs(n + 1); while(q--) { int R, V; cin >> R >> V; if(cost[R] < V) { cout << 0 << '\n'; continue; } int l = 1, r = dist[R]; while(l <= r) { int mid = (l + r) >> 1, u = R; for(int i = 0; i < 20; i++) { if((1 << i) & mid) u = dp[i][u]; } if(V > cost[R] - cost[u]) l = mid + 1; else r = mid - 1; } int u = R; --l; for(int i = 0; i < 20; i++) { if((1 << i) & l) u = dp[i][u]; } cout << u << '\n'; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...