南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。
所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。
现在,请你写一个程序,帮小工回答南将军每次的询问吧。
注意,南将军可能询问很多次。
-
输入
-
只有一组测试数据
第一行是两个整数N,Q,其中N表示士兵的总数。Q表示南将军询问的次数。(1<N<=100000,1<Q<=1000000)
随后的一行有N个整数Vi(0<=Vi<100000000),分别表示每个人的杀敌数。
再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。
输出
- 对于每次询问,输出第m号士兵到第n号士兵之间所有士兵杀敌数的最大值与最小值的差。 样例输入
-
5 2 1 2 6 9 3 1 2 2 4
样例输出
-
1 7
#include "stdio.h"
#include "math.h"
#define MAX_ROW 100
#define MAX_COL 20
#define DATA_NUM 20
#define MIN_COL 20
#define MIN_ROW 20
#define MAX(a,b) a > b ? a:b
#define MIN(a,b) a > b ? b:a
int RMQ_ARR[MAX_ROW][MAX_COL];//稀疏表的结构
int RMQ_ARR2[MIN_ROW][MIN_COL];
int data[DATA_NUM];
void createKmqMax (int n) {//n表示的是元素的个数
int i;
int j;
for (i = 1;i <=n;i++ ) {
RMQ_ARR[i][0] = data[i];
}
for (i = 1;i <=n;i++ ) {
RMQ_ARR2[i][0] = data[i];
}
for (j = 1;j <= (int)(log ((double)(n)) / log (2.0));j++) {
for (i = 1;i + (1 << j) - 1 <= n;i++) {
RMQ_ARR[i][j] = MAX (RMQ_ARR[i][j-1],RMQ_ARR[i + (1 << (j - 1))][j-1]);
RMQ_ARR2[i][j] = MIN (RMQ_ARR2[i][j-1],RMQ_ARR2[i + (1 << (j - 1))][j-1]);
}
}
}
int query_MAX (int a,int b) {
int length = b - a + 1;
int k = (int)(log (length) / log (2.0));
// printf("->%d",result);
return MAX (RMQ_ARR[a][k],RMQ_ARR[b-(1 << (k)) +1][k]);
}
int main () {
int n;
int i;
int j;
int query = 10;
int start;
int end;
scanf ("%d",&n);
for (i = 1;i <=n;i++) {
scanf ("%d",data + i);//零号单元没有使用
}
createKmqMax (n);
for (j = 0;j <=query;j++) {
scanf ("%d%d",&start,&end);
printf("%d and %d max is %d\n",start,end,query_MAX (start,end));
}
return 0;
}
多多交流呀!