水题一枚...
#include<cstdio> #include<cstring> #define left l,m,x<<1 #define right m+1,r,x<<1|1 #define eps 1e8 const int LMT=50002; int hei[LMT<<2],sho[LMT<<2],__hei,__sho; inline int max(int a,int b) { return a>b?a:b; } inline int min(int a,int b) { return a<b?a:b; } void init(void) { int i; for(i=0;i<LMT<<2;i++) { hei[i]=0; sho[i]=(int)eps; } } void update(int op,int pos,int l,int r,int x) { if(l==r) { hei[x]=sho[x]=op; return; } int m=(l+r)>>1; if(pos<=m) { update(op,pos,left); hei[x]=max(hei[x],hei[x<<1]); sho[x]=min(sho[x],sho[x<<1]); } if(pos>m) { update(op,pos,right); hei[x]=max(hei[x],hei[x<<1|1]); sho[x]=min(sho[x],sho[x<<1|1]); } } void equery(int L,int R,int l,int r,int x) { if(L<=l&&r<=R) { __hei=max(__hei,hei[x]); __sho=min(__sho,sho[x]); return; } int m=(l+r)>>1; if(L<=m)equery(L,R,left); if(R>m)equery(L,R,right); } int main(void) { int i,n,h,q,l,r; while(~scanf("%d%d",&n,&q)) { init(); for(i=1;i<=n;i++) { scanf("%d",&h); update(h,i,1,n,1); } while(q--) { __hei=0;__sho=(int)eps; scanf("%d%d",&l,&r); equery(l,r,1,n,1); printf("%d\n",__hei-__sho); } } return 0; }