제출 #404401

#제출 시각아이디문제언어결과실행 시간메모리
404401hiderrFountain (eJOI20_fountain)C++14
100 / 100
219 ms14916 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 100000; const int LOG_N = 17; long long sum[MAX_N + 1]; int height[MAX_N + 1], last[MAX_N + 1]; const int NONE = 0; int pointers[MAX_N + 1][LOG_N + 1]; int find_level(int r, long long v, long long required) { int i = 0; while(sum[pointers[r][i]] > required) i++; if(i == 0) return r; return find_level(pointers[r][i-1], v, required); } int main() { cin.tie(0); ios_base::sync_with_stdio(false); int n, q; cin >> n >> q; stack<pair<int, int>> mq; mq.push({ 0, NONE }); for(int i = 1; i <= n; i++) { cin >> height[i] >> sum[i]; } for(int i = n; i >= 1; i--) { pair<int, int> t = mq.top(); while (mq.top().second != NONE && mq.top().first <= height[i]) { mq.pop(); t = mq.top(); } last[i] = t.second; mq.push({height[i], i}); } for(int i = n; i >= 1; i--) { if(last[i] != NONE) { sum[i] += sum[last[i]]; pointers[i][0] = last[i]; for(int j = 1; j <= LOG_N; j++) { int next_pointer = pointers[pointers[i][j-1]][j-1]; if(next_pointer != NONE) pointers[i][j] = next_pointer; else break; } } } int r; long long v; for(int do_not_use_me = 0; do_not_use_me < q; do_not_use_me++) { cin >> r >> v; long long required = sum[r] - v; if(required < 0) { cout << 0 << '\n'; continue; } cout << find_level(r, v, required) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...