Submission #1336442

#TimeUsernameProblemLanguageResultExecution timeMemory
1336442sporknivesHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
2395 ms185092 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

struct node {
	int s,e,m,val;
	node *l,*r;
	node(int _s, int _e) {
		s=_s,e=_e,m=(s+e)/2;
		val=0;
		if(s!=e){
			l=new node(s,m);
			r=new node(m+1,e);
		}
	}
	
	void update(int x, int v) {
		if(s==e) {
			val=v;
			return;
		}
		if(x<=m)l->update(x,v);
		else r->update(x,v);
		val=max(l->val,r->val);
	}
	
	int qry(int x, int y) {
		if(s==x&&e==y)return val;
		else if(y<=m)return l->qry(x,y);
		else if(x>m)return r->qry(x,y);
		else return max(l->qry(x,m),r->qry(m+1,y));
	}
}*root;

signed main() {
	int n,q; cin>>n>>q;
	vector<int> a(n);
	for(int i=0;i<n;i++) cin>>a[i];
	stack<pii> s;
	unordered_map<int,vector<pair<pii,int>>> queries;
	for(int i=0;i<q;i++) {
		int l,r,k; cin>>l>>r>>k; l--; r--;
		queries[r].push_back({{l,k},i});
	}
	
	vector<int> max_inv; max_inv.assign(n,0);
	root = new node(0,n-1);
	for(int i=0;i<n;i++) root->update(i,0);
	
	bool ans[q];
	for(int i=0;i<n;i++) {
		while(!s.empty() && s.top().first<=a[i]) {
			s.pop();
		}
		if(!s.empty()) {
			max_inv[s.top().second] = max(max_inv[s.top().second], s.top().first + a[i]);
			root->update(s.top().second, max_inv[s.top().second]);
		}
		s.push({a[i],i});
		for(pair<pii,int> query: queries[i]) {
			int l = query.first.first, k = query.first.second, idx = query.second;
			int mx = root->qry(l,i);
			if(mx>k) ans[idx]=false;
			else ans[idx]=true;
		}
	}
	
	for(int i=0;i<q;i++) cout<<ans[i]<<"\n";
	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...