对拍了几千组随机数据全过了,挂的是 k>n 的部分,前面的暴力应该没错。二分写的是倍增,题解没有类似做法,孩子被调崩溃了,求有缘大佬调或是给组hack。
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize("Ofast", "inline", "-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits\stdc++.h>
using namespace std;
inline int read()
{
char cc;
while(1){cc=getchar();if((cc>='0'&&cc<='9')||cc=='-')break;}
int sum=0,flag=1;
cc=='-'?flag=-1:sum=(cc^48);
while(1){cc=getchar();if(!(cc>='0'&&cc<='9'))break;sum=(sum<<1)+(sum<<3)+(cc^48);}
return sum*flag;
}
const int N=2e5+5,B=455;
int n,q,a[N],sum[B][N],lev,num,pos=1,l,r;
bool ans[N];
struct node
{
int x,k,id;
}b[N];
bool cmp(node a,node b)
{
return a.k<b.k;
}
int main()
{
cout.tie(0);
n=read(),q=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=450;i++)
{
lev=1;
num=0;
for(int j=0;j<=n;j++)
{
if(a[j]>=lev)
{
num++;
if(num%i==0)lev++;
}
sum[i][j]=lev;
}
}
for(int i=1;i<=q;i++)
{
b[i].x=read(),b[i].k=read();
b[i].id=i;
}
sort(b+1,b+q+1,cmp);
while(pos<=q&&b[pos].k<=450)
{
if(sum[b[pos].k][b[pos].x-1]<=a[b[pos].x])
ans[b[pos].id]=1;
pos++;
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
if(a[i]<=450)
sum[a[i]][i]++;
for(int i=1;i<=450;i++)
for(int j=1;j<=n;j++)
sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
while(pos<=q)
{
lev=num=l=1;
r=0;
while(b[pos].x-r-sum[lev-1][b[pos].x]+sum[lev-1][r]>=b[pos].k)
{
for(int i=1<<30;i;i>>=1)
if(r+i<b[pos].x&&r+i-l+1-sum[lev-1][r+i]+sum[lev-1][l-1]<b[i].k)r+=i;
r++;
l=r+1;
lev++;
}
if(r==b[pos].x||lev<=a[b[pos].x])ans[b[pos].id]=1;
pos++;
}
for(int i=1;i<=q;i++)
cout<<(ans[i]?"YES\n":"NO\n");
return 0;
}