这是一道最基础的RMQ算法模板题,如果刚刚学会该算法,可以拿这个题练练手。
#include<stdio.h>
#include<math.h>
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y
int M,m;
int maxn[100001][50];
int minn[100001][50];
void pre(int n)
{
int i,j;
for(i=1;(1<<i)<=n;i++)
for(j=1;j-1+(1<<i)<=n;j++)
{
maxn[j][i]=max(maxn[j][i-1],maxn[j+(1<<(i-1))][i-1]);
minn[j][i]=min(minn[j][i-1],minn[j+(1<<(i-1))][i-1]);
}
}
void query(int l,int r)
{
int k=log(r-l+1)/log(2);
M=max(maxn[l][k],maxn[r+1-(1<<k)][k]);
m=min(minn[l][k],minn[r+1-(1<<k)][k]);
}
int main()
{
int N,Q,i;
scanf("%d%d",&N,&Q);
for(i=1;i<=N;i++)
{
scanf("%d",&maxn[i][0]);
minn[i][0]=maxn[i][0];
}
pre(N);
while(Q--)
{
int l,r;
scanf("%d%d",&l,&r);
query(l,r);
printf("%d\n",M-m);
}
}