地址:http://poj.org/problem?id=3368
思路:倍增DP模板题..
Code:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAX_N=5e4+5;
int n,Q;
int a[MAX_N];
int dp1[MAX_N][20],dp2[MAX_N][20];
int main()
{
scanf("%d%d",&n,&Q);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
dp1[i][0]=dp2[i][0]=a[i];
}
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i+(1<<j)-1<=n;++i)
{
dp1[i][j]=min(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
dp2[i][j]=max(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);
}
int l,r,k,Min,Max;
while(Q--){
scanf("%d%d",&l,&r);
k=log2(r-l+1);
Min=min(dp1[l][k],dp1[r-(1<<k)+1][k]);
Max=max(dp2[l][k],dp2[r-(1<<k)+1][k]);
printf("%d\n",Max-Min);
}
return 0;
}