Submission #441457

#TimeUsernameProblemLanguageResultExecution timeMemory
441457elazarkorenFountain (eJOI20_fountain)C++17
100 / 100
845 ms34616 KiB
#include <iostream> #include <vector> #include <algorithm> #include <stack> #define x first #define y second #define int long long using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> pii; typedef vector<pii> vii; const int MAX_N = 1e5 + 2; const int infinity = 1e9 + 1; int d[MAX_N], c[MAX_N], loga[MAX_N]; int32_t main() { int n, q; cin >> n >> q; for (int i = 1; i <= n; i++) cin >> d[i] >> c[i]; for (int i = 2; i <= n; i++) { loga[i] = loga[i >> 1] + 1; } vector<vii> dp(loga[n] + 1, vii(n + 2, {n + 1, infinity})); d[n + 1] = c[n + 1] = infinity; stack<int> stk; stk.push(n + 1); for (int i = n; i; i--) { while (d[stk.top()] <= d[i]) stk.pop(); dp[0][i] = {stk.top(), c[i]}; stk.push(i); } for (int i = 1; i <= loga[n]; i++) { for (int j = 1; j <= n; j++) { dp[i][j].x = dp[i - 1][dp[i - 1][j].x].x; dp[i][j].y = dp[i - 1][j].y + dp[i - 1][dp[i - 1][j].x].y; } } while (q--) { int r, v; cin >> r >> v; for (int i = loga[n]; i >= 0; i--) { if (dp[i][r].y < v) { v -= dp[i][r].y; r = dp[i][r].x; } } cout << (r == n + 1 ? 0 : r) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...