//@auther Yang Zongjun
//http://www.cnblogs.com/wuyiqi/archive/2011/10/24/2223017.html
//http://blog.csdn.net/acdreamers/article/details/8692384
///注意啊,雨神给的PPT上关于rmq_find()函数有误,
///以后就用这个模板了, 是我敲代码时看错了PPT是对的
#include <iostream>
#include <cstdio>
#include <cmath>
//#include <string.h>
//#include <string>
#include <cstring>
using namespace std;
#define PI acos(-1.0)
#define EPS 1e-8
const int MAXN = 50005;
const int INF = 2100000000;
int a[MAXN], ans[MAXN];
int dpmin[MAXN][20], dpmax[MAXN][20];
int n, q;
void rmq_st()
{
//memset(dpmax, 0, sizeof(dpmax));
//memset(dpmin, 0, sizeof(dpmin));
for(int i = 0; i < n; i++)
{
dpmin[i][0] = a[i];
dpmax[i][0] = a[i];
}
int m = (int)(log(1.0 * n) / log(2.0));
for(int j = 1; j <= m; j++)
{
int t = n - (1 << j) + 1;
for(int i = 0; i <= t; i++)
{
dpmin[i][j] = min(dpmin[i][j - 1], dpmin[i + (1 << (j - 1))][j - 1]);
dpmax[i][j] = max(dpmax[i][j - 1], dpmax[i + (1 << (j - 1))][j - 1]);
}
}
}
inline int rmq_findmin(int l, int r)
{
int k = (int)(log(1.0 * (r - l +1)) / log(2.0));
return min(dpmin[l][k], dpmin[r - (1 << k) + 1][k]);
}
inline int rmq_findmax(int l, int r)
{
int k = (int)(log(1.0 * (r - l +1)) / log(2.0));
return max(dpmax[l][k], dpmax[r - (1 << k) + 1][k]);
}
int main()
{
//freopen("C:/Users/Admin/Desktop/input.txt", "r", stdin);
while(~scanf("%d %d", &n, &q))
{
int x, y;
for(int i = 0; i < n; i++)
{
//cin >> a[i];
scanf("%d", &a[i]);
}
rmq_st();
for(int i = 0; i < q; i++)
{
//cin >> x >> y;
// cout << rmq_findmax(x-1,y-1) - rmq_findmin(x-1,y-1) << endl;
scanf("%d%d", &x, &y);
printf("%d\n", rmq_findmax(x-1,y-1) - rmq_findmin(x-1, y-1));
}
}
return 0;
}
[NWPU][2014][TRN][22]RMQ和LCA C - RMQ POJ 3264
最新推荐文章于 2015-04-14 17:48:19 发布