Submission #1286008

#TimeUsernameProblemLanguageResultExecution timeMemory
1286008LIAHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
3099 ms96524 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<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({r, l, k, j}); } Seg seg(n + 1); sort(queries.begin(), queries.end()); ll last = -1; vector<ll> ans(m, 0); vll st; for (auto [r, l, k, j] : queries) { while (last < r) { last++; seg.update_val(1, last, 0, n - 1, w[last]); ll L = -1; while (!st.empty() && w[st.back()] <= w[last]) { L = st.back(); st.pop_back(); } if (last - 1 >= L + 1) seg.update_range(1, 0, n - 1, L + 1, last - 1, w[last]); st.push_back(last); } 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...