POJ3264(Balanced Lineup)

这题可以看成是“集训每日一题0711”的简化版,没有修改操作,只需查询最小和最大的。

View Code
#include <stdio.h>
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define INF 0x7fffffff
#define N 50001
int n,m,D;
int min[4*N],max[4*N];
void init()
{
    int i,t;
    for(D=1;D<n+2;D<<=1);
    for(i=1;i<2*D;i++)
    {
        min[i]=INF;
        max[i]=0;
    }
    for(i=1;i<=n;i++)
    {
        scanf("%d",&t);
        min[i+D]=max[i+D]=t;
    }
    for(i=D-1;i^1;i--)
    {
        min[i]=MIN(min[i<<1],min[i<<1|1]);
        max[i]=MAX(max[i<<1],max[i<<1|1]);
    }
}
int getmin(int x,int y)
{
    int i=x+D-1,j=y+D+1,ret=INF;
    for(;i^j^1;i>>=1,j>>=1)
    {
        if(~i&1)    ret=MIN(ret,min[i^1]);
        if(j&1) ret=MIN(ret,min[j^1]);
    }
    return ret;
}
int getmax(int x,int y)
{
    int i=x+D-1,j=y+D+1,ret=0;
    for(;i^j^1;i>>=1,j>>=1)
    {
        if(~i&1)    ret=MAX(ret,max[i^1]);
        if(j&1) ret=MAX(ret,max[j^1]);
    }
    return ret;
}
int main()
{
    int i,a,b;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",getmax(a,b)-getmin(a,b));
        }
    }
    return 0;
}
posted @ 2012-07-11 15:33  BeatLJ  阅读(189)  评论(0编辑  收藏  举报