이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e6+5;
long long segmax[4*MAXN];
long long segmin[4*MAXN];
long long ans[4*MAXN];
long long arr[MAXN];
void build(long long curr,long long l,long long r){
if(l==r){
segmax[curr] = arr[l];
segmin[curr] = arr[r];
ans[curr] = 0;
return;
}
long long mid = (l+r)/2;
build(2*curr,l,mid);
build(2*curr+1,mid+1,r);
segmax[curr] = max(segmax[2*curr],segmax[2*curr+1]);
segmin[curr] = min(segmin[2*curr],segmin[2*curr+1]);
long long tempans = 0;
if(segmax[2*curr]>segmin[2*curr+1]){
tempans = segmax[2*curr]+segmin[2*curr+1];
}
ans[curr] = max(max(ans[2*curr],ans[2*curr+1]),tempans);
}
pair<long long,pair<long long,long long>> query(long long curr,long long l,long long r,long long tl,long long tr){
if(l>tr||r<tl){
pair<long long,pair<long long,long long>> hold;
hold.first = -1;
hold.second.second = 0;
hold.second.second = 0;
return hold;
}
if(l>=tl && r<=tr){
pair<long long,pair<long long,long long>> hold;
// cout<<l<<" "<<r<<" "<<ans[curr]<<endl;
hold.first = ans[curr];
hold.second.first = segmax[curr];
hold.second.second = segmin[curr];
return hold;
}
long long mid = (l+r)/2;
auto holdfirst = query(2*curr,l,mid,tl,tr);
auto holdsecond = query(2*curr+1,mid+1,r,tl,tr);
pair<long long,pair<long long,long long>> tempans;
// cout<<l<<" "<<r<<" "<<holdfirst.first<<" "<<holdsecond.second.second<<endl;
tempans.first = 0;
if(holdfirst.second.first>holdsecond.second.second && holdfirst.second.first!=0 && holdsecond.second.second!=0){
tempans.first = holdfirst.second.first+holdsecond.second.second;
}
// cout<<l<<" "<<r<<" "<<tempans.first<<endl;
tempans.first =max(max(holdfirst.first,holdsecond.first),tempans.first);
tempans.second.first=max(holdfirst.second.first,holdsecond.second.first);
if(holdfirst.second.second == 0){
tempans.second.second = holdsecond.second.second;
}else if(holdsecond.second.second == 0){
tempans.second.second = holdfirst.second.second;
}else{
tempans.second.second = min(holdfirst.second.second,holdsecond.second.second) ;
}
return tempans;
}
int main() {
long long n,m;
cin>>n>>m;
for(long long i=1;i<=n;i++){
cin>>arr[i];
}
build(1,1,n);
for(long long i=1;i<=m;i++){
long long l,r,k;
cin>>l>>r>>k;
// cout<<l<<" "<<r<<" "<<query(1,1,n,l,r).first<<endl;
if(query(1,1,n,l,r).first>k){
cout<<0<<endl;
}else{
cout<<1<<endl;
}
}
}
# | 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... |