Submission #631840

#TimeUsernameProblemLanguageResultExecution timeMemory
631840gromperenHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++11
100 / 100
1299 ms93728 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int MAXN = 1e6+5;
int tree[4*MAXN];
int a[MAXN];
vector<tuple<int,int,int>> queries[MAXN];
bool ans[MAXN];

void upd(int i, int v, int x, int lx, int rx) {
	if (lx == rx) {
		tree[x] = v;
		return;
	}

	int mid = (lx + rx) / 2;
	if (i <= mid) upd(i, v, 2*x, lx, mid);
	else upd(i, v, 2*x+1, mid+1, rx);
	tree[x] = max(tree[2*x], tree[2*x+1]);
}

int qry(int l, int r, int x, int lx, int rx) {
	if (l <= lx && rx <= r) return tree[x];
	if (r < lx || rx < l) return 0;
	int mid = (lx+rx) /2;
	return max(qry(l,r,2*x,lx,mid), qry(l,r,2*x+1,mid+1,rx));
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n, m; cin >> n >> m;
	//vector<int> a(n+1);
	//vector<vector<tuple<int,int,int>>> queries(n+1);
	//vector<int> ans(n+1);
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	for (int i = 1; i <= m; ++i) {
		int l, r, k; cin >> l >> r >> k;
		queries[r].push_back({l, k, i});
	}

	//cout << "OK"<<endl;
	
	stack<int> st;
	for (int i = 1; i <= n; ++i) { // iterate from 1 to n over Rs in queries
		while(!st.empty() && a[st.top()] <= a[i]) st.pop();
		if (!st.empty()) { // Greedily include swap(st.top(), i) at st.top(), because all future Rs are >= than i
			upd(st.top(), a[st.top()] + a[i], 1, 1, n);
		} 		
		for (auto &x : queries[i]) {
			int l = get<0>(x);
			int k = get<1>(x);
			int j = get<2>(x);
			if (qry(l, i, 1, 1, n) <= k) ans[j] = 1;
			else ans[j] = 0;
		}
		st.push(i);
	}
	for (int i = 1; i <= m; ++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...