Submission #152623

#TimeUsernameProblemLanguageResultExecution timeMemory
152623leathermanHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
64 / 100
748 ms262148 KiB
#include<bits/stdc++.h> //#include<ext/pb_ds/assoc_container.hpp> //#include<ext/pb_ds/tree_policy.hpp> // //#pragma GCC optimize("-O3") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("unroll-loops") #define ll int #define ld long double #define endl "\n" #define fi first #define se second #define y1 sadjfskldf #define PB push_back #define sqr(x) ((x) * (x)) #define all(x) x.begin(), x.end() using namespace std; //using namespace __gnu_pbds; //mt19937_64 rnd(chrono::system_clock::now().time_since_epoch().count()); const ll N = 5e6 + 2; // //template <typename T> //using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; struct node { ll val; node *l,*r; node() : val(0), l(nullptr), r(nullptr){} }; node *root[N],*mb; ll n,Q,a[N],x,pos,l,r,k; vector<pair<ll, ll> > v; void build(node *v,ll tl,ll tr) { if(tl == tr) return; ll tm = (tl + tr) / 2; v -> l = new node(); v -> r = new node(); build(v -> l, tl, tm); build(v -> r, tm + 1, tr); } void upd(node *old, node *now,ll tl,ll tr,ll pos,ll val) { if(tl == tr) { now -> val = val; return; } ll tm = (tl + tr) / 2; if(pos <= tm) { now -> r = old -> r; now -> l = new node(); upd(old -> l, now -> l, tl, tm, pos, val); } else { now -> l = old -> l; now -> r= new node(); upd(old -> r, now -> r, tm + 1, tr, pos, val); } now -> val = max((now -> l) -> val, (now -> r) -> val); } ll get(node *v,ll tl,ll tr,ll l,ll r) { if(l > r) return 0; if(tl == l && tr == r) return v -> val; ll tm = (tl + tr) / 2; return max(get(v -> l, tl, tm, l, min(r, tm)), get(v -> r, tm + 1, tr, max(l, tm + 1), r)); } int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>Q; for(int i = 1; i <= n; i++) cin>>a[i]; root[n + 1] = new node(); build(root[n + 1], 1, n); for(int i = n; i >= 1; i--) { x = a[i]; root[i] = new node(); root[i] -> val = root[i + 1] -> val; root[i] -> l = root[i + 1] -> l; root[i] -> r = root[i + 1] -> r; while(!v.empty() && v.back().fi < x) { pos = v.back().se; mb = new node(); upd(root[i], mb, 1, n, pos, a[pos] + x); root[i] = mb; v.pop_back(); } v.PB({x, i}); } while(Q--) { cin>>l>>r>>k; x = get(root[l], 1, n, l, r); cout<<(x <= k)<<endl; } return 0; } /* 5 2 3 5 1 8 2 1 3 6 2 5 3 */
#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...