Submission #1286012

#TimeUsernameProblemLanguageResultExecution timeMemory
1286012LIAHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
1179 ms114840 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define vll vector<ll> #define loop(i, s, e) for (ll i = s; i < e; ++i) #define pll pair<ll, ll> const ll inf = 1e18; struct Node { ll ans, mx; }; struct Seg { vector<Node> seg; vector<ll> lazy; ll sz = 1; Seg(ll n) { for (; sz < n; sz *= 2) ; seg.resize(2 * sz, {0, 0}); lazy.resize(2 * sz, -inf); } void push(ll i, ll l, ll r) { ll& upd = lazy[i]; if (upd != -inf && l != r) { if (seg[i * 2].mx < upd) { seg[i * 2].ans = max(seg[i * 2].ans, seg[i * 2].mx + upd); lazy[i * 2] = max(lazy[i * 2], upd); } if (seg[i * 2 + 1].mx < upd) { seg[i * 2 + 1].ans = max(seg[i * 2 + 1].ans, seg[i * 2 + 1].mx + upd); lazy[i * 2 + 1] = max(lazy[i * 2 + 1], upd); } upd = -inf; } } void update_val(ll i, ll idx, ll l, ll r, ll val) { if (l == r) { seg[i].mx = val; seg[i].ans = 0; lazy[i] = -inf; return; } push(i, l, r); ll mid = (l + r) / 2; if (idx <= mid) update_val(i * 2, idx, l, mid, val); else update_val(i * 2 + 1, idx, mid + 1, r, val); seg[i].mx = max(seg[i * 2].mx, seg[i * 2 + 1].mx); seg[i].ans = max(seg[i * 2].ans, seg[i * 2 + 1].ans); } void update_range(ll i, ll l, ll r, ll a, ll b, ll val) { if (l > b || r < a) return; if (l >= a && r <= b) { if (seg[i].mx < val) { seg[i].ans = max(seg[i].ans, seg[i].mx + val); lazy[i] = max(lazy[i], val); return; } if (l == r) return; } push(i, l, r); ll mid = (l + r) / 2; update_range(i * 2, l, mid, a, b, val); update_range(i * 2 + 1, mid + 1, r, a, b, val); seg[i].ans = max(seg[i * 2].ans, seg[i * 2 + 1].ans); } ll query(ll i, ll l, ll r, ll a, ll b) { if (l > b || r < a) return 0; if (l >= a && r <= b) { return seg[i].ans; } push(i, l, r); ll mid = (l + r) / 2; return max(query(i * 2, l, mid, a, b), query(i * 2 + 1, mid + 1, r, a, b)); } }; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); ll n, m; cin >> n >> m; vll w(n); loop(i, 0, n) cin >> w[i]; vector<tuple<ll, ll, ll, ll>> queries; for (ll j = 0; j < m; ++j) { ll l, r, k; cin >> l >> r >> k; r--; l--; queries.push_back({l, r, k, j}); } Seg seg(n + 1); loop(i, 0, n) seg.update_val(1, i, 0, n - 1, w[i]); sort(queries.begin(), queries.end(), [&](const auto& A, const auto& B) { return get<0>(A) > get<0>(B); }); ll curL = n; vector<ll> ans(m, 0); vll st; for (auto [l, r, k, j] : queries) { while (curL > l) { curL--; while (!st.empty() && w[st.back()] < w[curL]) st.pop_back(); ll R = (st.empty() ? n : st.back()); if (curL + 1 <= R - 1) seg.update_range(1, 0, n - 1, curL + 1, R - 1, w[curL]); st.push_back(curL); } if (l == r) { ans[j] = 1; continue; } ll k_for_range = seg.query(1, 0, n - 1, l, r); if (k_for_range <= k && k_for_range >= 0) { ans[j] = 1; } else ans[j] = 0; } for (auto it : ans) { cout << it << "\n"; } return 0; }
#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...