Submission #1280877

#TimeUsernameProblemLanguageResultExecution timeMemory
1280877uranium235Editor (BOI15_edi)C++17
15 / 100
190 ms37668 KiB
#include <bits/stdc++.h> using namespace std; const int inf = INT32_MAX / 2; template <class a, class b> ostream& operator<<(ostream &l, const pair<a, b> &r) { l << "(" << r.first << ", " << r.second << ")"; return l; } template <class t> ostream& operator<<(ostream &l, const vector<t> &r) { l << "{"; for (int i = 0; i + 1 < r.size(); i++) l << r[i] << ", "; if (!r.empty()) l << r.back(); l << "}"; return l; }; struct segtree { vector<pair<int, int>> a; vector<set<int>> base; int n; segtree(int n) : n(n), a(4 * n, {inf, -1}), base(n) {} pair<int, int> qry(int ql, int qr, int l, int r, int v) { if (r < ql || qr < l) return {inf, -1}; else if (ql <= l && r <= qr) return a[v]; else { int m = (l + r) / 2; return min(qry(ql, qr, l, m, 2 * v), qry(ql, qr, m + 1, r, 2 * v + 1)); } } pair<int, int> qry(int ql, int qr) { return qry(ql, qr, 0, n - 1, 1); } void upd(int l, int r, int v, int i, int x, bool mod) { if (l == r) { if (mod) { bool added = base[i].insert(x).second; assert(added); } else { bool removed = base[i].erase(x); assert(removed); } a[v] = base[i].empty() ? make_pair(inf, -1) : make_pair(*base[i].begin(), i); } else { int m = (l + r) / 2; if (i <= m) upd(l, m, 2 * v, i, x, mod); else upd(m + 1, r, 2 * v + 1, i, x, mod); a[v] = min(a[2 * v], a[2 * v + 1]); } } void upd(int i, int x, bool mod) { upd(0, n - 1, 1, i, x, mod); } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; a[i] *= -1; } vector<int> parity(n), p(n, -1); segtree tree(n + 1); for (int i = n - 1; i >= 0; i--) { int level = max(0, a[i]); pair<int, int> ans; while ((ans = tree.qry(level + 1, n)).second != -1) { // cout << i << " " << ans << endl; parity[i] = 1 - parity[ans.first]; tree.upd(ans.second, ans.first, false); assert(p[ans.first] == -1); p[ans.first] = i; // cout << "link " << i << " " << ans.first << endl; if (parity[ans.first]) { } else { break; } } tree.upd(level, i, true); } vector<int> root(n); for (int i = 0; i < n; i++) { if (p[i] == -1) root[i] = i; else root[i] = root[p[i]]; } set<int> states; for (int i = 0; i < n; i++) { set<int>::iterator it = states.find(root[i]); if (it == states.end()) { states.insert(root[i]); } else { states.erase(it); } if (states.empty()) cout << 0; else { cout << -a[*states.rbegin()]; } cout << '\n'; } // cout << p << endl; // cout << root << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...