感觉这个题是数据有些水了,线段树的错误复杂度加个快读就能过,故申请加强数据
(本人线段树水过的代码)
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int maxnn=1e5+5;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int a[maxnn],maxn[maxnn<<2];
void push_up(int k){
maxn[k]=max(maxn[k<<1],maxn[k<<1|1]);
}
void buildtree(int k,int l,int r){
if(l==r){
maxn[k]=a[l];
return ;
}
int m=(l+r)>>1;
buildtree(k<<1,l,m);
buildtree(k<<1|1,m+1,r);
push_up(k);
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&y>=r){
return maxn[k];
}
int res=(int)-1e18;
int m=(l+r)>>1;
if(x<=m){
res=max(res,query(k<<1,l,m,x,y));
}
if(y>=m+1){
res=max(res,query(k<<1|1,m+1,r,x,y));
}
return res;
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
buildtree(1,1,n);
while(m--){
int l,r;
l=read();
r=read();
cout<<query(1,1,n,l,r)<<'\n';
}
return 0;
}