题目大意:有一排牛,给定每头牛的高度,然后有一系列的询问,即给出i,j,要求输出第i个牛和第j个牛之间的最高的牛和最矮的牛之间高度差值。
思路:典型的区间最值查询,获取最大值和最小值后相减即可。
#include <stdio.h>
#include <math.h>
int n,q;
#define MAXN 50010
int dp_max[MAXN][20];
int dp_min[MAXN][20];
int num[MAXN];//存储数据信息,从0到n-1
int get_max(int a, int b) {
if (a>b)
return a;
return b;
}
int get_min(int a, int b) {
if (a>b)
return b;
return a;
}
void RMQ_preproccess() {
int i,j;
for (i=0;i<n;i++) {
dp_max[i][0]=num[i];
dp_min[i][0]=num[i];
}
for (j=1;(1<<j)<=n;j++) {
for (i=0;i+(1<<j)-1<n;i++) {
dp_max[i][j]=get_max(dp_max[i][j-1],dp_max[i+(1<<(j-1))][j-1]);
dp_min[i][j]=get_min(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ_max(int s, int v) {
int k=(int)(log((v-s+1)*1.0)/log(2.0));
return get_max(dp_max[s][k],dp_max[v-(1<<k)+1][k]);
}
int RMQ_min(int s, int v) {
int k=(int)(log((v-s+1)*1.0)/log(2.0));
return get_min(dp_min[s][k],dp_min[v-(1<<k)+1][k]);
}
int main()
{
int i;
int s,v;
scanf("%d%d",&n,&q);
for (i=0;i<n;i++)
scanf("%d",&num[i]);
RMQ_preproccess();
for (i=0;i<q;i++) {
scanf("%d%d",&s,&v);
s--;
v--;
printf("%d\n",RMQ_max(s,v)-RMQ_min(s,v));
}
return 0;
}