#include <bits/stdc++.h>
#define el '\n'
#define FNAME "Library"
#define allof(x) x.begin(),x.end()
#define allof1(x) x.begin()+1,x.end()
#define mset(x,n) memset(x,(n),sizeof(x))
using namespace std;
const long long MOD = (long long)1e9 + 7;
template<class X,class Y> bool minimize(X &a,Y b){ if(a>b){a=b;return true;}return false;}
template<class X,class Y> bool maximize(X &a,Y b){ if(a<b){a=b;return true;}return false;}
void setup(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
if(fopen(FNAME".inp","r")){
freopen(FNAME".inp","r",stdin);
freopen(FNAME".out","w",stdout);
}
}
using ll = long long;
const ll NEG = -(1LL<<60);
struct Query{
int l,r;
ll k;
int id;
};
int n,q;
vector<ll> a;
vector<int> prevGreater;
vector<ll> pairVal;
struct SegmentTree{
int n;
vector<ll> st;
SegmentTree(): n(0) {}
SegmentTree(int N){init(N);}
void init(int N){
n = N;
st.assign(4*N+5, NEG);
}
void update(int node,int l,int r,int pos,ll val){
if(l==r){
st[node] = max(st[node],val);
return;
}
int mid=(l+r)>>1;
if(pos<=mid) update(node<<1,l,mid,pos,val);
else update(node<<1|1,mid+1,r,pos,val);
st[node] = max(st[node<<1],st[node<<1|1]);
}
void point_update_max(int pos,ll val){
update(1,1,n,pos,val);
}
ll query(int node,int l,int r,int L,int R){
if(R<l || r<L) return NEG;
if(L<=l && r<=R) return st[node];
int mid=(l+r)>>1;
return max(query(node<<1,l,mid,L,R),
query(node<<1|1,mid+1,r,L,R));
}
ll range_max(int L,int R){
if(L>R) return NEG;
return query(1,1,n,L,R);
}
} seg;
void init(){
cin >> n >> q;
a.assign(n+1,0);
for(int i=1;i<=n;i++) cin >> a[i];
prevGreater.assign(n+1,0);
pairVal.assign(n+1,NEG);
vector<int> st;
st.reserve(n);
for(int i=1;i<=n;i++){
while(!st.empty() && a[st.back()] <= a[i]) st.pop_back();
if(!st.empty()) prevGreater[i] = st.back();
else prevGreater[i] = 0;
st.push_back(i);
if(prevGreater[i] > 0) pairVal[i] = a[i] + a[prevGreater[i]];
}
}
void sol(){
vector<Query> qs;
qs.reserve(q);
for(int i=0;i<q;i++){
int l,r; ll k; cin >> l >> r >> k;
qs.push_back({l,r,k,i});
}
sort(qs.begin(), qs.end(), [](const Query&A,const Query&B){
if(A.r != B.r) return A.r < B.r;
return A.l < B.l;
});
seg.init(n);
vector<int> ans(q,0);
int ptr=0;
for(int r=1;r<=n;r++){
if(prevGreater[r]>0){
seg.point_update_max(prevGreater[r], pairVal[r]);
}
while(ptr<(int)qs.size() && qs[ptr].r==r){
int L=qs[ptr].l;
int R=qs[ptr].r;
ll k=qs[ptr].k;
int id=qs[ptr].id;
ll mx=seg.range_max(L,R);
if(mx==NEG) ans[id]=1;
else ans[id]=(mx<=k)?1:0;
++ptr;
}
}
for(int i=0;i<q;i++) cout << ans[i] << el;
}
int main(){
setup();
init();
sol();
return 0;
}
Compilation message (stderr)
sortbooks.cpp: In function 'void setup()':
sortbooks.cpp:16:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
16 | freopen(FNAME".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
sortbooks.cpp:17:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
17 | freopen(FNAME".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |