调不出来,思路如下:
1、读入一个数就处理一次最大值最小值
2、最后同时处理最大值,最小值
#include<bits/stdc++.h>
#define ll long long
#define maxn 50010
#define inf 0x7fffffff
using namespace std;
ll Max=-1,Min=inf;
ll h[maxn],n,m,c[maxn],b[maxn];
inline int read(){
int x=0,t=1;
char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
inline ll lowbit(ll x){
return x& -x;
}
inline void update(ll x,ll k){
for(;x<=n;x+=lowbit(x)) {
c[x]=min(c[x],k),b[x]=max(b[x],k);
}
}
inline ll solve(ll l,ll r){
Max=-1,Min=0x7fffffff;
while(l<=r){
for(;r-(r&-r)>=1;r-=r&-r)
Max=max(Max,b[r]),Min=min(Min,c[r]);
Max=max(Max,h[r]),Min=min(Min,h[r]);
r--;//防漏
}
return Max-Min;
}
int main(){
n=read();
m=read();
memset(b,inf,sizeof(b));
memset(c,-1,sizeof(c));
for(int i=1;i<=n;++i){
h[i]=read();
update(i,h[i]);
}
while(m--){
int x=read(),y=read();
cout<<solve(x,y)<<endl;
}
return 0;
}