Submission #1286009

#TimeUsernameProblemLanguageResultExecution timeMemory
1286009LIAHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
1012 ms130944 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) { 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; return; } 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 (seg[i].mx <= val) return; if (l >= a && r <= b) { if (l == r) { seg[i].ans = max(seg[i].ans, seg[i].mx + val); } else { 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); } return; } 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; } 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<vector<tuple<ll, ll, ll>>> byL(n); loop(j, 0, m) { ll l, r, k; cin >> l >> r >> k; l--, r--; byL[l].push_back({r, k, j}); } Seg seg(n + 1); loop(i, 0, n) seg.update_val(1, i, 0, n - 1, w[i]); vll nxt(n, n); vector<ll> st; loop(i, 0, n) { while (!st.empty() && w[st.back()] <= w[i]) { nxt[st.back()] = i; st.pop_back(); } st.push_back(i); } vector<ll> ans(m, 0); for (ll i = n - 1; i >= 0; --i) { if (i + 1 <= nxt[i] - 1) seg.update_range(1, 0, n - 1, i + 1, nxt[i] - 1, w[i]); for (auto [r, k, j] : byL[i]) { if (i == r) { ans[j] = 1; continue; } ll v = seg.query(1, 0, n - 1, i, r); ans[j] = (v <= k && v >= 0) ? 1 : 0; } } loop(i, 0, m) cout << ans[i] << "\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...