Submission #1219266

#TimeUsernameProblemLanguageResultExecution timeMemory
1219266boclobanchatHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
0 / 100
1085 ms123684 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);
	}
}
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...