一片绿地的N(1≤N≤50000)颗树排成一排,在一个美好的下午,园艺师傅接到任务对这N棵树修剪,园艺师傅已经知道这N颗树的高度H(1≤H≤1000000)。园艺师傅街道的任务有Q(1≤Q≤200000)个小任务,对于每一个小任务,园艺师傅都要知道特定区间最高的树和最矮的树的高度差。园艺师傅不会算法,这个任务对他有些难,你能帮助他吗?
Input
第一行为N(1≤N≤50000)和Q(1≤Q≤200000);.
从第2行到第N+1行,每行一个数字, 表示第i棵树的高度(1≤height≤1000000); 从第N+2行到第N+Q+1行,每行两个整数A和B(1≤A≤B≤N), 表示从第A颗树到第B颗树这个区间所有的树。
Output
从第一行到第Q行,每行一个整数,表示从第A棵树到第B棵树之间,最高树与最矮树的高度差。.
Sample Input
5 3
5
2
9
8
1
1 2
1 4
3 5
Sample Output
3
7
8
查询区间值(以前写的码风怎么这么好。。。)
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
using namespace std;
const double eps = 1e-8;
typedef long long LL;
const int maxn=50000+5;
const int inf = 0x3f3f3f3f;
int mx[maxn*4],minn[maxn*4];
int a[maxn];
int n,m;
void build(int l,int r,int i)
{
if(l==r){
int num;
scanf("%d",&num);
mx[i]=num;
minn[i]=num;
return ;
}
int mid=(l+r)>>1;
build( l, mid,i<<1);
build(mid+1, r,i<<1|1);
mx[i]=max(mx[i<<1],mx[i<<1|1]);
minn[i]=min(minn[i<<1],minn[i<<1|1]);
}//建树
int ma=0,mi=inf;
void query(int ql,int qr,int l,int r,int i)
{
if(ql<=l && r<=qr){
if(mx[i]>ma)
ma=mx[i];
if(minn[i]<mi)
mi=minn[i];
return;
}
int mid=(l+r)>>1;
int res=0;
if(ql<=mid) query(ql,qr,l, mid,i<<1);
if(mid<qr) query(ql,qr,mid+1,r,i<<1|1);
}
int main()
{
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i=0;i<m;++i){
int x,y;
scanf("%d%d",&x,&y);
ma=0;
mi=inf;
query(x,y,1,n,1);
printf("%d\n",ma-mi);
}
return 0;
}