题意:
思路:
关注特殊点:
保留最长的
三元组
对于三元组,删去中间那个元素就破坏了三元组
保留最长的:删除所有三元组中中间那个元素
每次询问都是求区间内最长的保留的元素个数
那么搞一下前缀和就好了
注意对于每次询问两边的不要算
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=2e5+10;
int N,Q,l,r;
int a[mxn],f[mxn],sum[mxn];
void solve(){
cin>>N>>Q;
for(int i=1;i<=N;i++) cin>>a[i];
for(int i=2;i<=N-1;i++){
if(a[i]<=a[i-1]&&a[i]>=a[i+1]) f[i]=1;
}
for(int i=1;i<=N;i++) sum[i]=sum[i-1]+f[i];
sum[N]=sum[N-1];
while(Q--){
cin>>l>>r;
int ans=r-l+1-(sum[r]-sum[l]);
if(f[r]) ans++;
cout<<min(ans,r-l+1)<<'\n';
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}