学习一下 RMQ,好吧,算是dp
poj 3264 算是模板题
RMQ,求给定区间的最值问题的,非线段树方法,DP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <cstring>
using namespace std;
const int maxn=50010;
int a[maxn];
int ma[maxn][20],mi[maxn][20];
int n,q;
void rmq_into()
{
for(int i=1;i<=n;i++)
ma[i][0]=mi[i][0]=a[i];
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
}
}
}
int get(int l,int r,bool mmax)
{
int k=(int)(log(r-l+1.0)/log(2.0));
if(mmax)
return max(ma[l][k],ma[r-(1<<k)+1][k]);
else return min(mi[l][k],mi[r-(1<<k)+1][k]);
}
int main()
{
int l,r;
while(~scanf("%d%d",&n,&q)){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
rmq_into();
for(int i=1;i<=q;i++){
scanf("%d%d",&l,&r);
printf("%d\n",get(l,r,1)-get(l,r,0));
}
}
return 0;
}