#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100009;
const ll inf=1e9;
ll n,m,x[N];
inline ll read(){
ll 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-48;
ch=getchar();
}
return x*f;
}
struct Segment{
ll l,r,mx;
} tr[N*4];
inline void build(ll u,ll l,ll r){//建树
if(l==r){
tr[u]=(Segment){l,r,x[l]};//区间内只有一个点
return;
}
ll m=(l+r)>>1;//二分
build((u<<1),l,m);//把左右两子树分别建树
build((u<<1)+1,m+1,r);
tr[u]=(Segment){l,r,max(tr[(u<<1)].mx,tr[(u<<1)+1].mx)};//更新节点信息
}
inline ll rmq(ll u,ll&l,ll&r){//查询
return (r<tr[u].l||l>tr[u].r)?(-inf):((l<=tr[u].l&&r>=tr[u].r)?(tr[u].mx):(max(rmq((u<<1),l,r),rmq((u<<1)+1,l,r))));
}
int main(){
n=read(),m=read();
for(ll i=1;i<=n;i=-~i)
x[i]=read();
build(1,1,n);
for(ll i=0;i<m;i=-~i){
ll l,r;
l=read(),r=read();
printf("%lld\n",rmq(1,l,r));
}
return 0;
}
网上说的卡常小技巧啥的都用了,但是还是#11 860+ms 求问有没有更好的方法。 玄关