原题链接:http://poj.org/problem?id=3264
题意:N头牛,标号1—N,每头牛一个高度,求Q次查询l,r标号内的最高与最低之差。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<string>
#include<stdio.h>
#define INF 1000000000
#define EPS 1e-6
using namespace std;
int N, Q;
int height[50005];
int minn[50005][20];
int maxx[50005][20];
void RMQ()
{
for (int i = 1; i <= N; i++)
{
minn[i][0] = height[i];
maxx[i][0] = height[i];
}
//int k = log2(N);
int k = log((double)N) / log(2.0);
for (int j = 1; j <= k; j++)
{
for (int i = 1; i <= N; i++)
{
if (i + (1 << j) - 1 <= N)
{
minn[i][j] = min(minn[i][j - 1], minn[i + (1 << (j - 1))][j - 1]);
maxx[i][j] = max(maxx[i][j - 1], maxx[i + (1 << (j - 1))][j - 1]);
}
}
}
}
int query(int l, int r)
{
//int k = log2(r - l + 1);
int k = log(double(r - l + 1)) / log(2.0);
int minAns = min(minn[l][k], minn[r - (1 << k) + 1][k]);
int maxAns = max(maxx[l][k], maxx[r - (1 << k) + 1][k]);
return maxAns - minAns;
}
int main()
{
while (~scanf("%d%d", &N, &Q))
{
int l, r;
for (int i = 1; i <= N; i++)
scanf("%d", &height[i]);
RMQ();
for (int i = 0; i < Q; i++)
{
scanf("%d%d", &l, &r);
printf("%d\n", query(l, r));
}
}
return 0;
}