POJ 3264 Balanced Lineup

/*
RMQ问题——稀疏表算法
状态转移方程
dp[i,j]=min{dp[i,j-1],dp[i+2j-1,j-1]}
*/
#include
<stdio.h>
#include
<math.h>
#include
<stdlib.h>
const int MAXN = 50001;
int max[MAXN][16],min[MAXN][16]; //2^16 = 65536
int a[MAXN];
int n, Q;
inline
int getMax(int a, int b){
return a > b ? a : b;
}
inline
int getMin(int a, int b){
return a < b ? a : b;
}
void RMQ_init(){
int i, j, m;
for(i = 1; i <= n; i++)
max[i][
0] = min[i][0] = a[i]; //i ~ i*2^0 即a[i]
m = (int)(log((double)n)/log(2.0));
for(j = 1; j <= m; ++j){ //自底向上递推
for(i = n; i > 0; i--){
max[i][j]
= getMax(max[i][j - 1], max[i + (1 << (j - 1))][j - 1]);
min[i][j]
= getMin(min[i][j - 1], min[i + (1 << (j - 1))][j - 1]);
}
}
}
int findMax(const int f,const int t){
if( f == t )
return max[f][0];
int m = (int)(log((double)(t - f + 1))/log(2.0));
return getMax(max[f][m], max[t + 1 - (1 << (m))][m]);
}
int findMin(const int f,const int t){
if( f == t )
return min[f][0];
int m = (int)(log((double)(t - f + 1))/log(2.0));
return getMin(min[f][m], min[t + 1 - (1 << (m))][m]);
}
int main(){
int f, t;
scanf(
"%d%d",&n, &Q);
for(int i = 1; i <= n; ++i)
scanf(
"%d",&a[i]);
RMQ_init();
for(int i = 0; i < Q; ++i){
scanf(
"%d%d", &f, &t);
if(f > t)
f
^= t ^= f ^= t;
printf(
"%d\n", findMax(f, t) - findMin(f, t));
}
return 0;
}
posted @ 2011-04-12 17:09  L..  阅读(180)  评论(0编辑  收藏  举报