比较纯的线段树吧,只需要写出一个构造函数和一个查询函数即可,不算太难
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=50001;
const int inf=1<<28;
struct node
{
int mini;
int maxi;
}t[maxn*3];
int c[maxn];
int n,q,ansa,ansb;
void Built(int L,int R,int index)
{
if(L==R)
{
t[index].maxi=t[index].mini=c[L];
return;
}
int mid=(L+R)>>1;
Built(L,mid,index<<1);
Built(mid+1,R,index<<1|1);
t[index].mini=min(t[index<<1].mini,t[index<<1|1].mini);
t[index].maxi=max(t[index<<1].maxi,t[index<<1|1].maxi);
}
void Query(int l,int r,int L,int R,int index)
{
if(l==L&&r==R)
{
ansa=min(ansa,t[index].mini);
ansb=max(ansb,t[index].maxi);
return;
}
int mid=(L+R)>>1;
if(r<=mid)
{
Query(l,r,L,mid,index<<1);
return;
}
if(l>mid)
{
Query(l,r,mid+1,R,index<<1|1);
return;
}
Query(l,mid,L,mid,index<<1);
Query(mid+1,r,mid+1,R,index<<1|1);
}
int main()
{
while(scanf("%d%d",&n,&q)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
Built(1,n,1);
for(int i=0;i<q;i++)
{
int ita,itb;
scanf("%d%d",&ita,&itb);
ansa=inf;
ansb=0;
Query(ita,itb,1,n,1);
printf("%d\n",ansb-ansa);
}
}
return 0;
}