Submission #342261

#TimeUsernameProblemLanguageResultExecution timeMemory
342261SeDunionHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
1097 ms59584 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 66;

// l<=i<=j<=r a[i] > a[j] a[i]+a[j]>x
// 

int a[N], ans[N];

vector<tuple<int,int,int>> q[N];

int f[N];
void upd(int i, int j) {
	i = N - 1 - i;
	while (i < N) {
		f[i] = max(f[i], j);
		i |= i + 1;
	}
}
int get(int i) {
	i = N - 1 - i;
	int j = 0;
	while (i >= 0) {
		j = max(j, f[i]);
		i &= i + 1;
		i--;
	}
	return j;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int n, m;
	cin >> n >> m;
	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;
		q[r].push_back({l, k, i});
	}
	stack<int> s;
	for (int i = 1 ; i <= n ; ++ i) {
		while (s.size() && a[s.top()] <= a[i]) s.pop();
		if (s.size()) {
			int j = s.top();
			upd(j, a[i] + a[j]);
		}
		s.push(i);
		for (auto [l, k, j] : q[i]) {
			ans[j] = (get(l) <= k);
		}
	}
	for (int i = 1 ; 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...