链接:点击打开链接
大水题一个。这周的线段树训练,恐怕就是这道最水啦。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 50010
struct node{
int l;
int r;
int min;
int max;
}anode[4*N];
int date[N];
int MIN(int a,int b){
return a>b?b:a;
}
int MAX(int a,int b){
return a>b?a:b;
}
void bulid(int l,int r,int n){
int i,mid;
mid=(l+r)>>1;
anode[n].l=l;
anode[n].r=r;
if(l==r){
anode[n].min=date[l];
anode[n].max=date[l];
return;
}
bulid(l,mid,2*n);
bulid(mid+1,r,2*n+1);
anode[n].min=MIN(anode[2*n].min,anode[2*n+1].min);
anode[n].max=MAX(anode[2*n].max,anode[2*n+1].max);
}
int querymin(int l,int r,int n){
int mid;
if(anode[n].l==l&&anode[n].r==r){
return anode[n].min;
}
mid=(anode[n].l+anode[n].r)>>1;
if(r<=mid)
querymin(l,r,2*n);
else if(l>mid)
querymin(l,r,2*n+1);
else
return MIN(querymin(l,mid,2*n),querymin(mid+1,r,2*n+1));
}
int querymax(int l,int r,int n){
int mid;
if(anode[n].l==l&&anode[n].r==r){
return anode[n].max;
}
mid=(anode[n].l+anode[n].r)>>1;
if(r<=mid)
querymax(l,r,2*n);
else if(l>mid)
querymax(l,r,2*n+1);
else
return MAX(querymax(l,mid,2*n),querymax(mid+1,r,2*n+1));
}
int main(){
int n,q,i,a,b;
while(~scanf("%d %d",&n,&q)){
for(i=1;i<=n;i++)
scanf("%d",&date[i]);
bulid(1,n,1);
while(q--){
scanf("%d %d",&a,&b);
printf("%d\n",querymax(a,b,1)-querymin(a,b,1));
}
}
return 0;
}