L[x]代表不递增序列,从x位置向左最远能延伸到的位置
R[x]代表不递减序列,从x位置向右最远能延伸到的位置
给出x,y
只用判断R[x]是否>=L[y]即可。
一看就感觉是水题。
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF =0x3f3f3f3f;
const int maxn= 100000 ;
int a[maxn+5];
int R[maxn+5];
int L[maxn+5];
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
R[n]=n;
for(int i=n-1;i>=1;i--)
{
if(a[i+1]<a[i]) R[i]=i;
else
{
R[i]=R[i+1];
}
}
L[1]=1;
for(int i=2;i<=n;i++)
{
if(a[i-1]<a[i]) L[i]=i;
else
{
L[i]=L[i-1];
}
}
int le,ri;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&le,&ri);
puts(R[le]>=L[ri]?"Yes":"No");
}
}
return 0;
}