Submission #1285849

#TimeUsernameProblemLanguageResultExecution timeMemory
1285849LIAHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
13 / 100
1455 ms98572 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]; if (lazy[i] < seg[i].mx) seg[i].ans = max(seg[i].ans, seg[i].mx + upd); if (l != r) { lazy[i * 2] = min(lazy[i * 2], upd); lazy[i * 2 + 1] = min(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; 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) { lazy[i] = min(lazy[i], val); push(i, l, r); 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; 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); // cout << k_for_range << endl; if (k_for_range <= k || k_for_range >= inf) { 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 5 3 4 2 2 4 1 */
#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...