pku 3264 Balanced Lineup

//RMQ做法,线段树竟然会快些,靠啊

#include <stdio.h>
#include <math.h>

 

#define MAXN 50001
#define MAXLOG 16

int N,a[MAXN],maxst[MAXN][MAXLOG],minst[MAXN][MAXLOG];

 

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 preprocess()
{
    int i,j,k=log(double(N))/log(2.0);
    for(i=1;i<=N;i++)
    {
        maxst[i][0]=minst[i][0]=a[i];
    }
    for(j=1;j<=k;j++)
        for(i=1;i+(1<<j)-1<=N;i++)
        {
            maxst[i][j]=Max(maxst[i][j-1],maxst[i+(1<<(j-1))][j-1]);
            minst[i][j]=Min(minst[i][j-1],minst[i+(1<<(j-1))][j-1]);
        }
}
int get_max(int a,int b)
{
    int k=log(double(b-a+1))/log(2.0);
    return Max(maxst[a][k],maxst[b-(1<<k)+1][k]);
}
int get_min(int a,int b)
{
    int k=log(double(b-a+1))/log(2.0);
    return Min(minst[a][k],minst[b-(1<<k)+1][k]);
}

inline void swap(int &a,int &b)
{
    int t=a;
    a=b;
    b=t;
}

int main()
{
    int i,j,Q;
    while(scanf("%d %d",&N,&Q)!=EOF)
    {
        for(i=1;i<=N;i++)
            scanf("%d",&a[i]);
        preprocess();
        while(Q--)
        {
            scanf("%d %d",&i,&j);
            if(i>j) swap(i,j);
            printf("%d\n",get_max(i,j)-get_min(i,j));
        }
    }
    return 0;
}

 

posted @ 2010-08-19 13:24  菜到不得鸟  阅读(88)  评论(0)    收藏  举报