제출 #1266896

#제출 시각아이디문제언어결과실행 시간메모리
1266896uranium235Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
1292 ms81084 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct state { int max = 0, rawMax = 0, st = INT32_MAX; void merge(state &l, state &r) { rawMax = std::max(l.rawMax, r.rawMax); max = std::max(l.max, r.max); } void push(state &l, state &r) { if (st == INT32_MAX) return; l.lazySet(st); r.lazySet(st); st = INT32_MAX; } void apply(int x) { lazySet(x); } int fold() { return max; } void lazySet(int x) { st = x; max = rawMax + x; } }; class lazyseg { public: int n; vector<state> a; lazyseg(int n, const vector<int> &books) : n(n), a(4 * n) { build(0, n - 1, 1, books); } void build(int l, int r, int v, const vector<int> &books) { if (l == r) { a[v].max = a[v].rawMax = books[l]; } else { int m = (l + r) / 2; build(l, m, 2 * v, books); build(m + 1, r, 2 * v + 1, books); a[v].merge(a[2 * v], a[2 * v + 1]); } } void upd(int ll, int rr, int l, int r, int v, int x) { if (r < ll || rr < l) return; else if (ll <= l && r <= rr) a[v].apply(x); else { a[v].push(a[2 * v], a[2 * v + 1]); int m = (l + r) / 2; upd(ll, rr, l, m, 2 * v, x); upd(ll, rr, m + 1, r, 2 * v + 1, x); a[v].merge(a[2 * v], a[2 * v + 1]); } } int qry(int ll, int rr, int l, int r, int v) { if (r < ll || rr < l) return INT32_MIN; else if (ll <= l && r <= rr) return a[v].fold(); else { a[v].push(a[2 * v], a[2 * v + 1]); int m = (l + r) / 2; return max(qry(ll, rr, l, m, 2 * v), qry(ll, rr, m + 1, r, 2 * v + 1)); } } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; vector<int> books(n); for (int &i : books) cin >> i; lazyseg tree(n, books); vector<array<int, 5>> queries; queries.reserve(q); for (int i = 0; i < q; i++) { int l, r, k; cin >> l >> r >> k; l--, r--; queries.push_back({l, r, k, i, -1}); } sort(queries.begin(), queries.end(), [](const array<int, 5> &l, const array<int, 5> &r) { return l[0] < r[0]; }); int ptr = q - 1; stack<pair<int, int>> stak; stak.push({n, INT32_MAX}); tree.upd(0, n - 1, 0, n - 1, 1, INT32_MIN); for (int i = n - 1; i >= 0; i--) { while (stak.top().second < books[i]) stak.pop(); tree.upd(i + 1, stak.top().first - 1, 0, n - 1, 1, books[i]); // cout << (i + 1) << " " << (stak.top().first - 1) << endl; stak.push({i, books[i]}); while (ptr >= 0 && queries[ptr][0] == i) { queries[ptr][4] = tree.qry(i, queries[ptr][1], 0, n - 1, 1); ptr--; } } sort(queries.begin(), queries.end(), [](const array<int, 5> &l, const array<int, 5> &r) { return l[3] < r[3]; }); for (int i = 0; i < q; i++) { cout << "01"[queries[i][4] <= queries[i][2]] << '\n'; // cout << queries[i][4] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...