#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, q, a[100010], maxx[400010], cur;
vector<int> node[400010];
int search(int id, int x) {
int l = 0, r = node[id].size()-1;
while (l <= r) {
int mid = (l+r)/2;
if (node[id][mid] >= x) r = mid-1;
else l = mid+1;
}
if (r >= 0) return x+a[r];
else return 0;
}
void build(int id, int x, int y) {
if (x == y) {
node[id].push_back(a[x]);
return;
}
int mid = (x+y)/2;
build(id*2,x,mid);
build(id*2+1,mid+1,y);
maxx[id] = max(max(maxx[id*2],maxx[id*2+1]),search(id*2+1,node[id*2].back()));
for (int i = 0; i < node[id*2].size(); i++) node[id].push_back(node[id*2][i]);
for (int i = 0; i < node[id*2+1].size(); i++) node[id].push_back(node[id*2+1][i]);
sort(node[id].begin(),node[id].end());
}
int query(int id, int x, int y, int l, int r) {
if ((l <= x) && (y <= r)) {
int tmp = search(id,cur);
cur = max(cur,node[id].back());
return max(tmp,maxx[id]);
}
if ((y < l) || (r < x)) return 0;
int mid = (x+y)/2;
return max(query(id*2,x,mid,l,r),query(id*2+1,mid+1,y,l,r));
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1,1,n);
while (q--) {
int l, r, k;
cin >> l >> r >> k;
cur = 0;
cout << (query(1,1,n,l,r) <= k) << "\n";
}
}
# | 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... |