제출 #1336048

#제출 시각아이디문제언어결과실행 시간메모리
1336048sporknivesHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
64 / 100
3106 ms310912 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

struct node {
	int s,e,m;
	vector<int> v;
	int max_inv=0;
	node *l, *r;
	node(int _s, int _e) {
		s=_s,e=_e,m=(s+e)/2;
		max_inv=0;
		if(s!=e) {
			l= new node(s,m);
			r = new node(m+1,e);
		}
	}
	
	void build() {
		if(s==e) return;
		vector<int> a,b; 
		for(int i=0;i<e-s+1;i++) {
			if(i<=m-s)a.push_back(v[i]);
			else b.push_back(v[i]);
		}
		l->v = a;
		r->v = b;
		l->build();
		r->build();
		v = merge(l->v, r->v);
		max_inv = max(l->max_inv, r->max_inv);
		int lmax=(l->v)[(l->v).size()-1];
		int rx = r->bsta(r->s, r->e, lmax);
		if(rx!=-1) max_inv = max(max_inv, lmax+rx);
	}

	vector<int> merge(vector<int> a, vector<int> b) {
		vector<int> res;
		int pa=0, pb=0;
		while(pa<a.size()&&pb<b.size()) {
			if(a[pa]<=b[pb]) {
				res.push_back(a[pa]);
				pa++;
			}
			else {
				res.push_back(b[pb]);
				pb++;
			}
		}
		while(pa<a.size()) {
			res.push_back(a[pa]);
			pa++;
		}
		while(pb<b.size()) {
			res.push_back(b[pb]);
			pb++;
		}
		
		return res;
	}
	// largest element less than k (or -1 if not found)
	int bsta(int x, int y, int k) {
		if(s==x && e==y) {
			auto lb = lower_bound(v.begin(),v.end(),k);
			if(lb==v.begin()) return -1;
			else return *(--lb);
		}
		if(y<=m) return l->bsta(x,y,k);
		else if(x>m) return r->bsta(x,y,k);
		return max(l->bsta(x,m,k),r->bsta(m+1,y,k));
	}
	
	// range max + largest inversion sum
	pii inv_query(int x, int y) {
		if(s==x && e==y) return {v[v.size()-1],max_inv};
		if(y<=m) return l->inv_query(x,y);
		else if(x>m) return r->inv_query(x,y);
		else {
			pii lres = l->inv_query(x,m);
			pii rres = r->inv_query(m+1,y);
			int mx  = max(lres.first,rres.first);
			int max_inv = max(lres.second, rres.second);
			int rx = bsta(m+1,y,lres.first);
			if(rx!=-1) max_inv = max(max_inv, lres.first + rx);
			
			return {mx, max_inv};
		}
	}
} *root;

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(nullptr);
	int n,q; cin>>n>>q;
	vector<int> a(n); for(int i=0;i<n;i++) cin>>a[i];
	root = new node(0, n-1);
	root->v = a;
	root->build();
	
	for(int i=0;i<q;i++) {
		int l,r,k; cin>>l>>r>>k; l--; r--;
		int max_inv = (root->inv_query(l,r)).second;
		if(max_inv>k) cout<<0;
		else cout<<1;
		//cout<<max_inv<<"\n";
		cout<<"\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...