poj 3264 区间最值

来源:岁月联盟 编辑:exp 时间:2012-11-08
[cpp] 
#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 | 1 
const 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;