题意
n头奶牛,给出每头牛的身高(1 ≤ N ≤ 50,000)
给出一个区间代表牛的编号
问区间中,最高的牛和最矮牛的身高差
思路
简单的线段树题目,对牛的身高建立最大值树和最小值树
查询所给区间的最大值和最小值,相减即为所求
代码
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define N 500001
int mx[4*N],mn[4*N];
int a[N];
void build(int k,int l,int r)
{
if(l==r){
mx[k]=a[l];
mn[k]=a[l];
return;
}
int mid=(l+r)/2;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
mx[k]=max(mx[k<<1],mx[k<<1|1]);
mn[k]=min(mn[k<<1],mn[k<<1|1]);
}
int query_max(int k,int l,int r,int x,int y)
{
if(r<x||l>y) return -1;
if(l>=x&&r<=y) return mx[k];
int mid=(l+r)>>1;
return max(query_max(k<<1,l,mid,x,y),query_max(k<<1|1,mid+1,r,x,y));
}
int query_min(int k,int l,int r,int x,int y)
{
if(r<x||l>y) return inf;
if(l>=x&&r<=y) return mn[k];
int mid=(l+r)>>1;
return min(query_min(k<<1,l,mid,x,y),query_min(k<<1|1,mid+1,r,x,y));
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
int t1,t2;
while(m--){
scanf("%d%d",&t1,&t2);
int x=query_max(1,1,n,t1,t2);
int y=query_min(1,1,n,t1,t2);
printf("%d\n",x-y);
}
return 0;
}