Balanced Lineup POJ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 50010
int n , q;
int h[MAXN];
struct Node{
   int l;
   int r;
   int minNum;
   int maxNum;
} tr[4*MAXN];
void build(int l,int r,int u){
    tr[u].l=l;
    tr[u].r=r;
    if(l==r)
    {
       tr[u].minNum=h[l];
       tr[u].maxNum=h[l];
       return;
    }
    int mid=l+r>>1;
    build(l ,mid,u<<1);
    build(mid+1,r,u<<1|1);
    tr[u].minNum=min(tr[u<<1].minNum,tr[(u<<1)+1].minNum);
    tr[u].maxNum=max(tr[u<<1].maxNum,tr[(u<<1)+1].maxNum);
}
//查询最大值
int queryMax(int l,int r,int u){
   if(tr[u].l==l&&tr[u].r==r)
     return tr[u].maxNum;
   int mid=tr[u].l+tr[u].r>>1;
   if(r<=mid)
     return queryMax(l,r,u<<1);
   else if(l>mid)
     return queryMax(l,r,u<<1|1);
   else
     return max(queryMax(l,mid,u<<1),queryMax(mid+1,r,(u<<1)+1));
}
//查询最小值
int queryMin(int l,int r,int u)
{
    if(tr[u].l==l&&tr[u].r==r)
      return tr[u].minNum;
    int mid=tr[u].l+tr[u].r>>1;
    if(r<=mid)
       return queryMin(l,r,u<<1);
    else if(l>mid)
       return queryMin(l ,r,u<<1|1);
    else
       return min(queryMin(l,mid,u<<1),queryMin(mid+1,r,(u<<1)+1));
}
int main(){
   while(scanf("%d%d",&n,&q)!=EOF)
   {
       for(int i=1;i<=n;i++)
          scanf("%d",&h[i]);
       build(1,n,1);
       int l,r;
       for(int i=0;i<q;i++){
          scanf("%d%d",&l,&r);      
          cout<<queryMax(l,r,1)-queryMin(l,r,1)<<endl;
       }
   }
   return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12293878.html