#include<cstdio>#include<string.h>#include<stdlib.h>#include<algorithm>#include<cmath>#include<iostream>using namespace std;#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1 | 1const int N=51002;int Max[N<<2],Min[N<<2],mmax,mmin;void PushUp(int rt){ Max[rt]=max(Max[rt<<1],Max[rt<<1|1]); Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);}void build(int l,int r,int rt){ if(l==r){ scanf("%d",&Min[rt]); Max[rt]=Min[rt]; // printf("%d\n",Max[rt]); return; } int mid=(l+r)>>1; build(lson); build(rson); PushUp(rt);} int query(int L,int R,int l,int r,int rt){ if(l>=L && r<=R){ return Min[rt]; } int mid=(l+r)>>1; int MM=1100000; if(mid >= L) MM=min(MM,query(L,R,lson)); if(mid < R) MM=min(MM, query(L,R,rson)); // MM=min(query(L,mid,lson),query(mid+1,R,rson)); //MMM=make_pair(max(max(MM.first,MM.second),max(M.first,M.second)),min(min(MM.first,MM.second),min(M.first,M.second))); return MM;}int Query(int L,int R,int l,int r,int rt){ if(l>=L&&r<=R){ return Max[rt]; } int mid=(l+r)>>1; int res=0; if(L<=mid) res= max(res,Query(L,R,lson)); if(mid <R) res =max(res,Query(L,R,rson)); return res;}#define Fin freopen("1.txt","r",stdin);#define Fout freopen("2.txt","w",stdout);int main(){ // Fin // Fout int a,b; int n,m; while(~scanf("%d%d",&n,&m)){ build(1,n,1); while(m--){ scanf("%d%d",&a,&b); //int Q=query(a,b,1,n,1); printf("%d\n",Query(a,b,1,n,1)-query(a,b,1,n,1)); } } return 0;}
水題不解釋,不過正在想能不能一下返回最大值和最小值,比如用pair<int,int>,這題也可以用RMQ線上來搞: