Submission #1164896

#TimeUsernameProblemLanguageResultExecution timeMemory
1164896_Knyaz_Fountain (eJOI20_fountain)C++17
30 / 100
46 ms4196 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 5; long long N, Q, D[MAXN], C[MAXN], nextReservoir[MAXN], prefixSum[MAXN]; vector<int> validReservoirs; void preprocess() { stack<int> s; for (int i = N; i >= 1; --i) { while (!s.empty() && D[s.top()] <= D[i]) { s.pop(); } nextReservoir[i] = s.empty() ? 0 : s.top(); s.push(i); } // Compute prefix sums for valid reservoirs prefixSum[0] = 0; for (int i = 1; i <= N; i++) { prefixSum[i] = prefixSum[i - 1] + C[i]; } } int findStoppingReservoir(int Ri, long long Vi) { // Binary search to find the first reservoir that accumulates at least Vi liters int L = Ri, R = N, answer = 0; while (L <= R) { int mid = (L + R) / 2; long long totalWater = prefixSum[mid] - prefixSum[Ri - 1]; if (totalWater >= Vi) { answer = mid; R = mid - 1; } else { L = mid + 1; } } return answer; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> N >> Q; for (int i = 1; i <= N; i++) { cin >> D[i] >> C[i]; } preprocess(); // Precompute overflow paths and prefix sums while (Q--) { int Ri; long long Vi; cin >> Ri >> Vi; cout << findStoppingReservoir(Ri, Vi) << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...