题意:
给定顺序输入整数,查询第x到第y个数之前 最大值与最小值的差
思路:
建立线段树。维护每个节点的最大值和最小值
#include <iostream>
#include <stdio.h>
#define lson i<<1,left,mid
#define rson i<<1|1,mid+1,right
using namespace std;
#define maxn 50010
int cows[maxn];
struct cow
{
int left;
int right;
int highest;
int lowest;
}Tree[maxn*3];
void Build(int i,int left,int right)
{
Tree[i].left=left;
Tree[i].right=right;
if(left==right)
{
Tree[i].highest=cows[left];
Tree[i].lowest=cows[left];
return ;
}
int mid=(left+right)>>1;
Build(lson);
Build(rson);
Tree[i].highest=max(Tree[i<<1].highest,Tree[i<<1|1].highest);
Tree[i].lowest=min(Tree[i<<1].lowest,Tree[i<<1|1].lowest);
}
int ans=0,hi,low;
void query(int i,int left,int right)
{
if(Tree[i].left==left&&Tree[i].right==right)
{
hi=max(hi,Tree[i].highest);
low=min(low,Tree[i].lowest);
// cout<<Tree[i].highest-Tree[i].lowest<<"Gg"<<endl;
return ;
}
int mid=(Tree[i].left+Tree[i].right)>>1;
if(left>mid)
{
query(i<<1|1,left,right);
}
else if(right<=mid)
{
query(i<<1,left,right);
}
else
{
query(lson);
query(rson);
}
}
int main()
{
int n,q;
cin>>n>>q;
int t;
for(int i=1;i <=n;i++)
{
scanf("%d",&cows[i]);
} Build(1,1,n);
int x;
int y;
while(q--)
{
scanf("%d%d",&x,&y);
low=1000001;
hi=0;
query(1,x,y);
printf("%d\n",hi-low);
}
return 0;
}