Submission #1280561

#TimeUsernameProblemLanguageResultExecution timeMemory
1280561jcelinHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
148 ms327680 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define F first
#define S second
#define pii pair < int, int >
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)

typedef long long ll;

using namespace std;

struct Tnode {
	
	int l, r;
	int v;
	pii chi;
	
	Tnode( void ) {
		chi = mp(-1, -1);
		l = -1;
		r = -1;
		v = 0;
	}
	
};

const int N = 1e6+10, Q = 1e6+10;
const int logN = 20, maxN = (1<<logN);
int curTnode;
Tnode T[(maxN<<1) + ((logN + 1) * Q)];
vector < int > roots;

int n, q;
int vals[N];
pii sortedvals[N];
int sazeto[N];
pii par[logN][N];

set < int > s;

void buildT( int i, int l, int r ) {
	
	curTnode++;
	T[i].l = l;
	T[i].r = r;
	
	if(r - l > 1) {
		T[i].chi.F = curTnode;
		buildT(curTnode, l, l + (r-l)/2);
		
		T[i].chi.S = curTnode;
		buildT(curTnode, l + (r-l)/2, r);
	}
	
}

void update( int i, int iold, int x, int v ) {
	
	curTnode++;
	T[i].l = T[iold].l;
	T[i].r = T[iold].r;
	
	if(T[i].r - T[i].l == 1) {
		T[i].v = v;
		return;
	}
	
	int mid = T[i].l + (T[i].r - T[i].l)/2;
	
	if(x < mid) {
		T[i].chi.F = curTnode;
		T[i].chi.S = T[iold].chi.S;
		update(curTnode, T[iold].chi.F, x, v);
		T[i].v = max(T[T[i].chi.F].v, T[T[i].chi.S].v);
		return;
	}
	
	T[i].chi.F = T[iold].chi.F;
	T[i].chi.S = curTnode;
	update(curTnode, T[iold].chi.S, x, v);
	T[i].v = max(T[T[i].chi.F].v, T[T[i].chi.S].v);
	
}

int query( int i, int lo, int hi ) {
	
	if(T[i].l >= hi || T[i].r <= lo) return 0;
	
	if(T[i].l >= lo && T[i].r <= hi) return T[i].v;
	
	return max(query(T[i].chi.F, lo, hi), query(T[i].chi.S, lo, hi));
}

void oneupdate( int i, int v ) {
	
	roots.pb(curTnode);
	update(curTnode, roots[(int) roots.size() - 2], i, v);
	
}

int taskquery( int l, int r ) {
	
	int out = 0;
	
	for(int i = logN - 1; i >= 0; i--) {
		if(par[i][l].F < r) {
			out = max(out, par[i][l].S);
			l = par[i][l].F;
		}
	}
	
	int temp = query(roots[sazeto[l]], l + 1, r);
	if(temp) temp += vals[l];
	
	out = max(out, temp);
	
	return out;
}

void task() {
	
	cin >> n >> q;
	for(int i = 0; i < n; i++) {
		cin >> vals[i];
		sortedvals[i] = mp(vals[i], i);
	}
	
	sort(sortedvals, sortedvals + n);
	
	for(int i = 0; i < n; i++) {
		sazeto[sortedvals[i].S] = i;
		if(i != 0 && sortedvals[i - 1].F == sortedvals[i].F) sazeto[sortedvals[i].S] = sazeto[sortedvals[i - 1].S];
		oneupdate(sortedvals[i].S, sortedvals[i].F);
	}
	
	s.insert(n);
	for(int i = n - 1; i >= 0; i--) {
		par[0][sortedvals[i].S].F = *s.lower_bound(sortedvals[i].S);
		s.insert(sortedvals[i].S);
	}
	
	for(int i = 0; i < n; i++) {
		par[0][i].S = query(roots[sazeto[i]], i + 1, par[0][i].F);
		if(par[0][i].S != 0) par[0][i].S += vals[i];
	}
	
	par[0][n] = mp(n, 0);
	
	for(int i = 0; i < logN - 1; i++) {
		for(int j = 0; j < n + 1; j++) {
			par[i + 1][j].F = par[i][par[i][j].F].F;
			par[i + 1][j].S = max(par[i][j].S, par[i][par[i][j].F].S);
		}
	}
	
	int l, r, k;
	
	for(int i = 0; i < q; i++) {
		cin >> l >> r >> k;
		cout << (taskquery(--l, r) <= k) << "\n";
	}
	
}

int main( void ) {
	
	FIO;
	
	roots.pb(0);
	buildT(0, 0, maxN);
	
	int tt = 1;
	while(tt--) task();
	
	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...