Submission #1277347

#TimeUsernameProblemLanguageResultExecution timeMemory
1277347WH8Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
1940 ms182904 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define ld long double

struct node {
	int s, e, m, v;
	node *l, *r;
	node (int S, int E){
		s=S,e=E,m=(e+s)/2,v=0;
		if(s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	void upd(int x, int nv){
		if(s==e){
			assert(s==x);
			v=nv;
			return;
		}
		if(x<=m)l->upd(x,nv);
		else r->upd(x, nv);
		v=max(l->v,r->v);
	}
	int qry(int S, int E){
		if(S<=s and e<=E){
			return v;
		}
		if(E<=m)return l->qry(S,E);
		else if(S>m)return r->qry(S,E);
		return max(l->qry(S,m), r->qry(m+1,E));
	}
} *root;

signed main(){
	int n,m;cin>>n>>m;
	int w[n+1];for(int i=1;i<=n;i++){cin>>w[i];}
	int ans[m];
	vector<tuple<int,int,int,int>> qs;
	for(int i=0;i<m;i++){
		int a,b,c;cin>>a>>b>>c;
		qs.pb({a,b,c,i});
	}
	sort(qs.begin(),qs.end());
	reverse(qs.begin(),qs.end());
	int qp=0;
	root=new node(1, n);
	stack<int> s;
	for(int i=n-1;i>=0;i--){
		while(!s.empty() and w[s.top()] < w[i]){
			root->upd(s.top(), w[s.top()]+w[i]);
			s.pop();
		}
		s.push(i);
		while(qp < m and get<0>(qs[qp])>=i){
			auto [l, r, k, ind] = qs[qp];
			if(root->qry(l, r) > k)ans[ind]=0;
			else ans[ind]=1;
			qp++;
		}
	}
	for(int i=0;i<m;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...