Submission #695067

#TimeUsernameProblemLanguageResultExecution timeMemory
695067TheSahibFountain (eJOI20_fountain)C++17
100 / 100
809 ms27048 KiB
#include <bits/stdc++.h> #define ll long long #define i128 __int128_t #define pii pair<int, int> #define oo 1e9 + 9 using namespace std; int n; vector<int> d; vector<int> c; vector<vector<int>> par; vector<vector<ll>> st; vector<int> msb; void build(){ msb.resize(n + 1, 0); for (int i = 2; i <= n; i++) { msb[i] = msb[i / 2] + 1; } st.resize(msb[n] + 1, vector<ll>(n + 1)); par.resize(msb[n] + 1, vector<int>(n + 1)); stack<int> s; s.push(n); for (int i = n; i >= 1; i--) { while(d[s.top()] <= d[i] && i != n){ s.pop(); } if(i == n){ par[0][i] = n; } else{ par[0][i] = s.top(); } st[0][i] = c[i]; s.push(i); } for (int j = 1; j <= msb[n]; j++) { for (int i = 1; i <= n; i++) { par[j][i] = par[j - 1][par[j - 1][i]]; st[j][i] = st[j - 1][i] + st[j - 1][par[j - 1][i]]; } } } int ask(int r, ll v){ int i = r; while(true){ int j = 0; while(j <= msb[n] && v > st[j][i]){ j++; } if(j == 0){ break; } v -= st[j - 1][i]; i = par[j - 1][i]; } if(i == n) i = 0; return i; } int main() { int q; cin >> n >> q; n++; d.resize(n + 1); c.resize(n + 1); for (int i = 1; i < n; i++) { cin >> d[i] >> c[i]; } d[n] = oo; c[n] = oo; build(); while(q--){ ll r, v; cin >> r >> v; cout << ask(r, v) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...