【题目描述】
奶牛排成了一条直队。
显然,不同的奶牛身高不一定相同。
现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A,且中间如果存在奶牛,则身高不能和A、B奶牛相同,问这样的一些奶牛最多会有多少头。
从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0、2,但不会是1)。
【输入】
第一行一个数N(2≤N≤100000),表示奶牛的头数。
接下来N个数,每行一个数,从上到下表示从左到右奶牛的身高(1≤身高≤264−1)。
【输出】
一行,表示最多奶牛数。
【输入样例】
5
1
2
3
4
1
【输出样例】
4
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int n,m;
int dp[maxn][25][2],a[maxn];
void rmq_init()
{
for(int i=1;i<=n;i++)
dp[i][0][0]=dp[i][0][1]=a[i];//初始化
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
dp[i][j][0]=max(dp[i][j-1][0],dp[i+(1<<j-1)][j-1][0]),
dp[i][j][1]=min(dp[i][j-1][1],dp[i+(1<<j-1)][j-1][1]);
return;
}
int rmq(int l,int r){
int k=log2(r-l+1);
return max(dp[l][k][0],dp[r-(1<<k)+1][k][0]);
}
int find(int l,int r){
int k=log2(r-l+1);
return min(dp[l][k][1],dp[r-(1<<k)+1][k][1]);
}
int main()
{
int x,y;
scanf("%d %d",&n,&m);
for( int i=1; i<=n; i++ ) scanf("%d",&a[i]);
rmq_init();
while(m--){
scanf("%d %d",&x,&y);
printf("%d\n",rmq(x,y)-find(x,y));
}
return 0;
}