#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
const int N=50010;
struct node
{
int max,min;
int l,r;
}tr[N<<2];
int n,m;
int input[N];
void pushup(int u)
{
tr[u].max=max(tr[u<<1].max,tr[u<<1|1].max);
tr[u].min=min(tr[u<<1].min,tr[u<<1|1].min);
}
void build(int u,int l,int r)
{
tr[u].l=l,tr[u].r=r;
if(l==r)
{
tr[u].max=input[l];
tr[u].min=input[l];
return ;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
int maxquery(int u,int l,int r)//询问区间最大值
{
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].max;
int res=0;
if(tr[u<<1].r>=l)res=max(res,maxquery(u<<1,l,r));
if(tr[u<<1|1].l<=r)res=max(res,maxquery(u<<1|1,l,r));
return res;
}
int minquery(int u,int l,int r)//询问区间最小值
{
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].min;
int res=INF;
if(tr[u<<1].r>=l)res=min(res,minquery(u<<1,l,r));
if(tr[u<<1|1].l<=r)res=min(res,minquery(u<<1|1,l,r));
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>input[i];
}
build(1,1,n);
for(int i=0;i<m;i++)
{
int l,r;
cin>>l>>r;
cout<<maxquery(1,l,r)-minquery(1,l,r)<<endl;
}
return 0;
}
D - 效率至上
于 2023-01-31 16:24:03 首次发布