Submission #1219280

#TimeUsernameProblemLanguageResultExecution timeMemory
1219280boclobanchatHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
1145 ms123784 KiB
#include<bits/stdc++.h> using namespace std; struct query { int l,r,k,pos; }; const int MAXN=1e6+69; const int INF=1e9; int A[MAXN],pref[MAXN],fl[MAXN],fr[MAXN],pos[MAXN],P[MAXN],dsu[MAXN],val[MAXN]; bool ans[MAXN]; vector<query> vq[MAXN]; int root(int i) { if(!dsu[i]) return i; return dsu[i]=root(dsu[i]); } void merge(int i,int j) { if((i=root(i))==(j=root(j))) return ; dsu[i]=j; } void dnc(int l,int r,vector<query> vi) { if(l==r) { for(auto v:vi) ans[v.pos]=true; return ; } int mid=(l+r)/2; vector<query> va,vb; for(auto v:vi) if(v.r<=mid) va.push_back(v); else if(mid<v.l) vb.push_back(v); dnc(l,mid,va); dnc(mid+1,r,vb); for(auto v:vi) if(v.l<=mid&&mid<v.r) vq[v.r].push_back(v); int pl=l,pr=mid+1; for(int i=l;i<=r;i++) { if(pl<=mid&&pr<=r) { if((pair<int,int>){A[pos[pl]],pos[pl]}<(pair<int,int>){A[pos[pr]],pos[pr]}) P[i]=pos[pl++]; else P[i]=pos[pr++]; } else if(pl<=mid) P[i]=pos[pl++]; else P[i]=pos[pr++]; } for(int i=l;i<=r;i++) pos[i]=P[i],val[i]=A[pos[i]]; for(int i=l;i<=r;i++) P[pos[i]]=i; for(int i=l-1;i<=r;i++) dsu[i]=0; pref[mid+1]=fl[mid+1]=fr[mid]=0; for(int i=mid+1;i<=r;i++) merge(P[i],P[i]-1); for(int i=l;i<=mid;i++) { merge(P[i],P[i]-1); int res=root(P[i]-1); if(res>=l) fl[i]=A[i]+val[res]; else fl[i]=0; } for(int i=mid;i>=l;i--) pref[i]=max(pref[i+1],P[i]),fl[i]=max(fl[i+1],fl[i]); for(int i=l-1;i<=r;i++) dsu[i]=0; int mx=0; for(int i=mid;i>=l;i--) merge(P[i],P[i]-1); for(int i=mid+1;i<=r;i++) { fr[i]=fr[i-1]; if(mx>A[i]) fr[i]=max(fr[i],mx+A[i]); else mx=A[i]; } for(int i=r;i>=mid;i--) { for(auto v:vq[i]) { bool ck=(max(fl[v.l],fr[v.r])<=v.k); int res=root(pref[v.l]-1); if(res>=l) res=val[pref[v.l]]+val[res]; else res=-1; if(res>v.k) ck=false; ans[v.pos]=ck; } vq[i].clear(); merge(P[i],P[i]-1); } for(int i=l-1;i<=r;i++) dsu[i]=0; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; for(int i=1;i<=n;i++) { cin>>A[i]; pos[i]=i; } vector<query> vq; for(int i=1;i<=q;i++) { int l,r,k; cin>>l>>r>>k; vq.push_back({l,r,k,i}); } dnc(1,n,vq); for(int i=1;i<=q;i++) cout<<ans[i]<<"\n"; }
#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...