Submission #403441

#TimeUsernameProblemLanguageResultExecution timeMemory
403441MathMateFountain (eJOI20_fountain)C++17
100 / 100
300 ms22404 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5 + 5; const int LOG = 20; const int INF = 1e9 + 5; struct Element { int wartosc, indeks; }; vector <int> dlugosci(MAX_N); int up[MAX_N][LOG]; int sumy_pojemnosci[MAX_N][LOG]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, t; cin >> n >> t; for(int i = 0; i < n; i++) { cin >> dlugosci[i] >> sumy_pojemnosci[i][0]; } dlugosci[n] = INF; sumy_pojemnosci[n][0] = INF; up[n][0] = n; stack <Element> kolejna_monotoniczna; kolejna_monotoniczna.push({dlugosci[n], n}); for(int i = n - 1; i >= 0; i--) { while(kolejna_monotoniczna.top().wartosc <= dlugosci[i]) { kolejna_monotoniczna.pop(); } up[i][0] = kolejna_monotoniczna.top().indeks; kolejna_monotoniczna.push({dlugosci[i], i}); } for(int i = 1; i < LOG; i++) { for(int j = 0; j < n; j++) { up[j][i] = up[up[j][i - 1]][i - 1]; sumy_pojemnosci[j][i] = min(sumy_pojemnosci[j][i - 1] + sumy_pojemnosci[up[j][i - 1]][i - 1], INF); } } for(int i = 0; i < t; i++) { Element zapytanie; cin >> zapytanie.indeks >> zapytanie.wartosc; zapytanie.indeks--; for(int j = LOG - 1; j >= 0; j--) { if(zapytanie.wartosc > sumy_pojemnosci[zapytanie.indeks][j]) { zapytanie.wartosc -= sumy_pojemnosci[zapytanie.indeks][j]; zapytanie.indeks = up[zapytanie.indeks][j]; } } cout << (zapytanie.indeks + 1) % (n + 1) << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...