大概题意是查询区间内的最大值和最小值的差是多少....也算是区间内最大的差?都一样...很简单 都不用更新只有查询的水题.....我觉得肯定有其他办法....
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int l,r,maxi,mini;
}data[300000];
int maxm,minm;
void build(int l,int r,int k)
{
data[k].l=l;
data[k].r=r;
if(l==r)
{
scanf("%d",&data[k].maxi);
data[k].mini=data[k].maxi;
return ;
}
int mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
data[k].maxi=max(data[k*2].maxi,data[k*2+1].maxi);
data[k].mini=min(data[k*2].mini,data[k*2+1].mini);
}
void query(int l,int r,int k)
{
if(data[k].l==l&&data[k].r==r)
{
maxm=max(maxm,data[k].maxi);
minm=min(minm,data[k].mini);
return ;
}
int mid=(data[k].l+data[k].r)/2;
if(r<=mid)
query(l,r,k*2);
else if(l>=mid+1)
query(l,r,k*2+1);
else
{
query(l,mid,k*2);
query(mid+1,r,k*2+1);
}
}
int main()
{
int n,q,a,b;
while(cin>>n>>q)
{
build(1,n,1);
for(int i=0;i<q;i++)
{
scanf("%d %d",&a,&b);
maxm=-10000000,minm=10000000;
query(a,b,1);
printf("%d\n",maxm-minm);
}
}
return 0;
}