Submission #501602

#TimeUsernameProblemLanguageResultExecution timeMemory
501602dxz05Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
64 / 100
3063 ms203044 KiB
#pragma GCC optimize("Ofast,O2,O3,unroll-loops") #pragma GCC target("avx2") #include <bits/stdc++.h> using namespace std; #define SZ(s) ((int)s.size()) #define all(x) (x).begin(), (x).end() #define lla(x) (x).rbegin(), (x).rend() #define MP make_pair inline void merge(vector<int> &v, const vector<int> &a, const vector<int> &b){ int n = a.size(), m = b.size(); int i = 0, j = 0; while (i < n || j < m){ if (i < n && (j == m || a[i] < b[j])) v.push_back(a[i++]); else v.push_back(b[j++]); } } #define tree qrisdfni struct node{ int ans = 0; int mx = -1; vector<int> vec; node(){}; } tree[2200000]; int size = 1; inline int lwb(int x, const vector<int> &v){ int i = lower_bound(all(v), x) - v.begin() - 1; if (i >= 0) return v[i]; return -1; } inline void build(int v, int tl, int tr, const vector<int> &a){ tree[v].vec.reserve(tr - tl + 1); if (tl == tr){ tree[v].ans = 0; tree[v].mx = a[tl - 1]; tree[v].vec = {a[tl - 1]}; return; } int tm = (tl + tr) >> 1; build(v + v, tl, tm, a); build(v + v + 1, tm + 1, tr, a); merge(tree[v].vec, tree[v + v].vec, tree[v + v + 1].vec); tree[v].mx = max(tree[v + v].mx, tree[v + v + 1].mx); tree[v].ans = max(tree[v + v].ans, tree[v + v + 1].ans); int x = lwb(tree[v + v].mx, tree[v + v + 1].vec); if (x != -1) tree[v].ans = max(tree[v].ans, tree[v + v].mx + x); } inline void init(const vector<int> &a){ size = a.size(); build(1, 1, size, a); } inline int biggest(int v, int tl, int tr, int l, int r, int key){ if (l <= tl && tr <= r){ int x = lwb(key, tree[v].vec); return (x != -1 ? x : -1); } if (tl > r || tr < l) return -1; int tm = (tl + tr) >> 1; return max(biggest(v + v, tl, tm, l, r, key), biggest(v + v + 1, tm + 1, tr, l, r, key)); } inline pair<int, int> get(int v, int tl, int tr, int l, int r){ if (l <= tl && tr <= r) return MP(tree[v].ans, tree[v].mx); if (tl > r || tr < l) return MP(0, -1); int tm = (tl + tr) >> 1; auto lf = get(v + v, tl, tm, l, r), rg = get(v + v + 1, tm + 1, tr, l, r); int ans = max(lf.first, rg.first); if (lf.second != -1 && rg.second != -1) { int x = biggest(1, 1, size, tm + 1, min(r, tr), lf.second); if (x != -1) ans = max(ans, lf.second + x); } return MP(ans, max(lf.second, rg.second)); } inline int get(int l, int r){ return get(1, 1, size, l, r).first; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, q; cin >> n >> q; vector<int> a(n); for (int &i : a) cin >> i; init(a); while (q--) { int l, r, k; cin >> l >> r >> k; cout << (get(l, r) <= k) << endl; } 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...