Submission #351903

#TimeUsernameProblemLanguageResultExecution timeMemory
351903cheissmartHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
0 / 100
3052 ms262144 KiB
#include <bits/stdc++.h>
#define IO_OP std::ios::sync_with_stdio(0); std::cin.tie(0);
#define F first
#define S second
#define V vector
#define PB push_back
#define MP make_pair
#define EB emplace_back
#define ALL(v) (v).begin(), (v).end()
#define debug(x) cerr << #x << " is " << x << endl
#define debu(x) cerr << #x << " is " << x << ", "

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef V<int> vi;

const int INF = 1e9 + 7, N = 1e6 + 7;

int a[N], ans[N], mx[N][20], mn[N][20];
V<array<int, 3>> G[N];

signed main()
{
	IO_OP;

	int n, m;
	cin >> n >> m;
	for(int i = 0; i < n; i++) {
		cin >> a[i];
		mx[i][0] = mn[i][0] = a[i];
	}
	for(int j = 1; j < 20; j++) {
		for(int i = 0; i + (1 << j) - 1 < n; i++) {
			mx[i][j] = max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
			mn[i][j] = min(mn[i][j - 1], mn[i + (1 << (j - 1))][j - 1]);
		}
	}
	auto qmx = [&] (int l, int r) {
		int k = __lg(r - l + 1);
		return max(mx[l][k], mx[r - (1 << k) + 1][k]);	
	};
	auto qmn = [&] (int l, int r) {
		int k = __lg(r - l + 1);
		return min(mn[l][k], mn[r - (1 << k) + 1][k]);	
	};
	for(int i = 0; i < m; i++) {
		int l, r, k;
		cin >> l >> r >> k;
		l--, r--;
		G[l].PB({r, k, i});
	}
	auto slow = [&] (int l, int r, int k) {
		while(r > l) {
			int mx = qmx(l, r);
			if(a[r] == mx) r--;
			else break;
		}
		if(r > l && qmx(l, r) + qmn(l, r) > k) return 0;
		return 1;
	};
	set<int> one_pos;
	priority_queue<pi, V<pi>, greater<pi>> zeros; // (val, pos)
	for(int i = n - 1; i >= 0; i--) {
		zeros.push({a[i], i});
		while(zeros.top().F < a[i]) {
			int pos = zeros.top().S;
			zeros.pop();
			one_pos.insert(pos);
		}
		for(auto qq:G[i]) {
			int r = qq[0], k = qq[1], qi = qq[2];
			// auto it = one_pos.upper_bound(r);
			// if(it == one_pos.begin()) {
			// 	ans[qi] = 1;
			// } else {
			// 	r = *prev(it);
			// 	if(qmx(i, r) + qmn(i, r) <= k) ans[qi] = 1;
			// 	else ans[qi] = 0;
			// }
			ans[qi] = slow(i, r, k);
		}
	}

	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...