题目描述

每天,农夫 John 的 头牛总是按同一序列排队。

有一天, John 决定让一些牛们玩一场飞盘比赛。他准备找一群在对列中为置连续的牛来进行比赛。但是为了避免水平悬殊,牛的身高不应该相差太大。John 准备了 个可能的牛的选择和所有牛的身高 h_i。他想知道每一组里面最高和最低的牛的身高差。

输入格式

第一行两个数 n,q

接下来 n 行,每行一个数 h_i

再接下来 q 行,每行两个整数 a 和 b,表示询问第 a 头牛到第 b 头牛里的最高和最低的牛的身高差。

输出格式

输出共 q 行,对于每一组询问,输出每一组中最高和最低的牛的身高差。

AC代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 int f1[100100][50];
 6 int f2[100100][50];
 7 int l,r;
 8 
 9 int main()
10 {
11     scanf("%d%d",&n,&m);
12     for (int i=1;i<=n;i++)
13     {
14         scanf("%d",&f1[i][0]);
15         f2[i][0]=f1[i][0];
16     }
17     for (int j=1;(1<<j)<=n;j++)
18         for (int i=1;i+(1<<j)-1<=n;i++)
19         {
20             f1[i][j]=min(f1[i][j-1],f1[i+(1<<(j-1))][j-1]);
21             f2[i][j]=max(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
22         }
23 
24     while (m--)
25     {
26         scanf("%d%d",&l,&r);
27         int k=log2(r-l+1);
28         int sum1,sum2,sum;
29         sum1=min(f1[l][k],f1[r-(1<<k)+1][k]);
30         sum2=max(f2[l][k],f2[r-(1<<k)+1][k]);
31         sum=abs(sum1-sum2);
32         printf("%d\n",sum);
33     }
34     return 0;
35 }