제출 #1111478

#제출 시각아이디문제언어결과실행 시간메모리
1111478Kirill22Editor (BOI15_edi)C++17
100 / 100
423 ms26364 KiB
#include "bits/stdc++.h" using namespace std; const int N = 300000; int t[4 * N]; void upd(int v, int l, int r, int i, int x) { if (l + 1 == r) { t[v] = x; return; } int m = (l + r) / 2; if (i < m) upd(v * 2 + 1, l, m, i, x); else upd(v * 2 + 2, m, r, i, x); t[v] = max(t[v * 2 + 1], t[v * 2 + 2]); } int get(int v, int l, int r, int x) { if (l + 1 == r) { return l; } int m = (l + r) / 2; if (t[v * 2 + 2] > x) { return get(v * 2 + 2, m, r, x); } else { return get(v * 2 + 1, l, m, x); } } void solve() { int n; cin >> n; fill(t, t + 4 * n, -(int) 1e9); vector<int> op(n), pr(n, -1), active(n), rt(n), tmp, have(n); for (int i = 0; i < n; i++) { cin >> op[i]; } for (int i = 0; i < n; i++) { if (op[i] > 0) { rt[i] = i; tmp.push_back(i); } else if (op[i - 1] > op[i]) { pr[i] = i - 1; tmp.push_back(i); } else { set<int> have(tmp.begin(), tmp.end()); while (!have.empty()) { int j = *have.rbegin(); have.erase(j); active[j] ^= 1; if (active[j]) { upd(0, 0, n, j, op[j]); } else { upd(0, 0, n, j, -(int) 1e9); } if (pr[j] != -1) { if (have.find(pr[j]) != have.end()) { have.erase(pr[j]); } else { have.insert(pr[j]); } } } pr[i] = get(0, 0, n, op[i]); tmp = {i}; } } map<int, int> cnt; std::fill(active.begin(), active.end(), 0); for (int i = 0; i < n; i++) { if (pr[i] != -1) { rt[i] = rt[pr[i]]; } int j = rt[i]; active[j] ^= 1; if (active[j]) { cnt[j] = 1; } else { cnt.erase(j); } cout << (cnt.empty() ? 0 : op[cnt.rbegin()->first]) << '\n'; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...