题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119&&http://poj.org/problem?id=3264
题目大意:给定一组数,询问多次,对于每次询问输出询问区间的最大值与最小值的差值。
这应该是RMQ的最基础的应用了,也可以当做模板使用。。。,代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 100002;
int Min[maxn][20], Max[maxn][20];
void RMQ_inin(int n)
{
for(int j = 1; (1<<j) <= n; j++)
for(int i = 0; i+(1<<j)-1 < n; i++)
{
Min[i][j] = min(Min[i][j-1], Min[i+(1<<(j-1))][j-1]);
Max[i][j] = max(Max[i][j-1], Max[i+(1<<(j-1))][j-1]);
}
}
int RMQ(int x, int y)
{
int k = 0;
while((1<<(k+1)) <= y-x+1)
k++;
int MaxRMQ = max(Max[x][k], Max[y-(1<<k)+1][k]);
int MinRMQ = min(Min[x][k], Min[y-(1<<k)+1][k]);
return MaxRMQ - MinRMQ;
}
int main()
{
int N, Q, x, y;
scanf("%d%d", &N, &Q);
for(int i = 0; i < N; i++)
{
scanf("%d", &Min[i][0]);
Max[i][0] = Min[i][0];
}
RMQ_inin(N);
while(Q--)
{
scanf("%d%d", &x, &y);
printf("%d\n", RMQ(x-1, y-1));
}
return 0;
}