This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxN=1000001,INF=999999999999;
ll w[maxN],ans[maxN];
queue<ll> intervals;
vector<ll> mSortTree[4*maxN+4];
ll sCost[4*maxN+4];
ll tSize=1;
ll mergeCost(ll ind1,ll ind2){
vector<ll> ::iterator lb;
ll size1=mSortTree[ind1].size();
ll size2=mSortTree[ind2].size();
ll a1,a2,a3,a4;
a1=mSortTree[ind1][0];
a2=mSortTree[ind1][size1-1];
a3=mSortTree[ind2][0];
a4=mSortTree[ind2][size2-1];
if(a4<a2){
return a2+a4;
}
if(a2<=a3){
return 0;
}
lb=lower_bound(mSortTree[ind2].begin(),mSortTree[ind2].end(),a2);
ll indx=0;
indx=lb-mSortTree[ind2].begin();
indx--;
return a2+mSortTree[ind2][indx];
}
void createTree(ll n){
while(tSize<n){
tSize*=2;
}
for(int i=tSize;i<tSize*2;i++){
if(i-tSize<n){
mSortTree[i].push_back(w[i-tSize]);
}else{
mSortTree[i].push_back(INF);
}
sCost[i]=0;
}
for(int i=tSize-1;i>=1;i--){
merge(mSortTree[i*2].begin(),mSortTree[i*2].end(),mSortTree[i*2+1].begin(),mSortTree[i*2+1].end(),back_inserter(mSortTree[i]));
sCost[i]=mergeCost(i*2,i*2+1);
//cout<<i<<" "<<sCost[i]<<"\n";
sCost[i]=max(sCost[i],sCost[i*2]);
sCost[i]=max(sCost[i],sCost[i*2+1]);
}
}
void getIntervals(ll l,ll r,ll sl,ll sr,ll idx){
if(sl>r or sr<l){
}else{
if(sl>=l and sr<=r){
intervals.push(idx);
}else{
ll mid=(sl+sr)/2;
getIntervals(l,r,sl,mid,idx*2);
getIntervals(l,r,mid+1,sr,idx*2+1);
}
}
}
ll query(ll l,ll r,ll n){
ll qAns=0;
getIntervals(l,r,1,n,1);
if(intervals.size()==1){
qAns=sCost[intervals.front()];
intervals.pop();
}else{
ll prev=intervals.front(),curr=0;
intervals.pop();
while(intervals.empty()==false){
curr=intervals.front();
intervals.pop();
qAns=max(qAns,sCost[curr]);
qAns=max(qAns,sCost[prev]);
qAns=max(qAns,mergeCost(prev,curr));
prev=curr;
}
}
return qAns;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
ll n,m,l,r,k;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>w[i];
}
createTree(n);
for(int i=0;i<m;i++){
cin>>l>>r>>k;
if(query(l,r,tSize)>k){
ans[i]=0;
}else{
ans[i]=1;
}
}
for(int i=0;i<m;i++){
cout<<ans[i]<<"\n";
}
return 0;
}
Compilation message (stderr)
sortbooks.cpp: In function 'long long int mergeCost(long long int, long long int)':
sortbooks.cpp:16:5: warning: variable 'a1' set but not used [-Wunused-but-set-variable]
ll a1,a2,a3,a4;
^~
# | 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... |