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;
}
浙公网安备 33010602011771号