#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
struct SegmentTree {
int n;
vector<long long> tree;
SegmentTree(vector<long long>& data) {
n = data.size();
tree.resize(4 * n);
build(1, 0, n - 1, data);
}
void build(int node, int l, int r, vector<long long>& data) {
if (l == r) {
tree[node] = data[l];
return;
}
int mid = (l + r) / 2;
build(node * 2, l, mid, data);
build(node * 2 + 1, mid + 1, r, data);
tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
}
long long query(int node, int l, int r, int ql, int qr) {
if (qr < l || r < ql)
return -INF;
if (ql <= l && r <= qr)
return tree[node];
int mid = (l + r) / 2;
return max(
query(node * 2, l, mid, ql, qr),
query(node * 2 + 1, mid + 1, r, ql, qr)
);
}
long long query(int l, int r) {
return query(1, 0, n - 1, l, r);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<long long> w(N);
for (int i = 0; i < N; i++) {
cin >> w[i];
}
vector<long long> bad(N, 0);
stack<long long> st;
for (int i = N - 1; i >= 0; i--) {
while (!st.empty() && st.top() >= w[i]) {
st.pop();
}
if (!st.empty()) {
bad[i] = w[i] + st.top();
}
st.push(w[i]);
}
SegmentTree seg(bad);
while (M--) {
int l, r;
long long k;
cin >> l >> r >> k;
l--;
r--;
long long mx = seg.query(l, r);
cout << (mx <= k ? 1 : 0) << '\n';
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |