Submission #1285975

#TimeUsernameProblemLanguageResultExecution timeMemory
1285975LIAHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
1407 ms98460 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}); // vfdsdwv lazy.resize(2 * sz, -inf); // vdsv } void push(ll i, ll l, ll r) { ll& upd = lazy[i]; seg[i].ans = max(seg[i].ans, seg[i].mx + upd); if (l != r) { lazy[i * 2] = max(lazy[i * 2], 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; 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); } void update_range(ll i, ll l, ll r, ll a, ll b, ll val) { if (l > b || r < a) return; push(i, l, r); if (l >= a && r <= b && seg[i].mx > val) { lazy[i] = max(lazy[i], val); return; } if (l >= a && r <= b && seg[i].mx <= val) { 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].ans, 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; push(i, l, r); 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); for (auto [r, l, k, j] : queries) { while (last < r) { last++; seg.update_val(1, last, 0, n - 1, w[last]); seg.update_range(1, 0, n - 1, 0, last - 1, w[last]); } if (l == r) { ans[j] = 1; continue; } ll k_for_range = seg.query(1, 0, n - 1, l, r - 1); // cout << k_for_range << endl; if (k_for_range <= k) { ans[j] = 1; } else ans[j] = 0; } for (auto it : ans) { cout << it << "\n"; } return 0; } /* 5 2 3 5 1 8 2 1 3 6 2 5 3 */ /* 2 1 4 1 1 2 2 */ /* 2 1 1 6 1 2 2 */ /* 5 1 1 2 3 4 1 3 5 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...