仍然强烈推荐这篇博文 我就是看这个学会的
http://dongxicheng.org/structure/lca-rmq/
这题是模板题了。。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<string>
#define inf 0x7fffffff
#define maxn 50010
#define log2(x) log((x))/log(2.0)
using namespace std;
int n,m;
int a[maxn];
int dp_ma[maxn][20];//dp_ma[i, j]表示从第i个数起连续2^j个数中的最大值
int dp_mi[maxn][20];//dp_mi[i, j]表示从第i个数起连续2^j个数中的最小值
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a<b?a:b;
}
void RMQ()
{
int i,j;
for(i=1;i<=n;i++)
dp_ma[i][0]=dp_mi[i][0]=a[i];
int k=log2(n*1.0);
for(j=1;j<=k;j++)
{
for(i=1;i<=n-(1<<(j-1));i++)
{
dp_ma[i][j]=Max(dp_ma[i][j-1],dp_ma[i+(1<<(j-1))][j-1]);
dp_mi[i][j]=Min(dp_mi[i][j-1],dp_mi[i+(1<<(j-1))][j-1]);
}
}
}
int query(int x,int y)
{
int ma,mi;
int k=log2(y-x+1.0);
ma=Max(dp_ma[x][k],dp_ma[y-(1<<k)+1][k]);
mi=Min(dp_mi[x][k],dp_mi[y-(1<<k)+1][k]);
return ma-mi;
}
int main() {
freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)==2)
{
int i;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
int x,y;
RMQ();
while(m--)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
}
return 0;
}