http://poj.org/problem?id=3264 是一道RMQ 算法的裸题,数据量很大,用 cin 估计会超的。
提供一个百度里面的讲解RMQ 的链接,感觉讲的还是很易懂的 http://qa4862741.blog.163.com/blog/static/56587549201162573625151/
View Code
#include<stdio.h>
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
#define N 50001
int mi[N][20],mx[N][20],w[N];
int n,q;
void rmqinit()
{
int i,j,m;
m = (int)(log((double)n)/log(2.0));
for(i = 1; i <= m; i++)
{
int ans = 1 << (i - 1);
for(j = n;j >= 1; j--)
{
if(j + ans <= n) mx[j][i] = max(mx[j][i - 1],mx[j + ans][i - 1]);
if(j + ans <= n) mi[j][i] = min(mi[j][i - 1],mi[j + ans][i - 1]);
}
}
}
int rmqmax(int l,int r)
{
int m = (int)(log(double(r - l + 1))/log(2.0));
int ans = r - (1 << m) + 1;
return max(mx[l][m],mx[ans][m]) - min(mi[l][m],mi[ans][m]);;
}
int main()
{
int i;
while(cin>>n>>q)
{
for(i = 1;i <= n; i++)
{
scanf("%d",&w[i]);
mi[i][0] = mx[i][0] = w[i];
}
rmqinit();
int l,r;
while(q--)
{
scanf("%d%d",&l,&r);
printf("%d\n",rmqmax(l,r));
}
}
return 0;
}