http://www.elijahqi.win/archives/3676
有的时候随机并不一定不好 看怎么随机 wc吃亏 什么时候可以长记性
要不是在弱省早就退役了
记忆化一下之前搜索过的一些位置
然后每次不断拓展 把整个排列随机几次然后乱搞即可
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
inline char gc(){
static char now[1<<16],*S,*T;
if(T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();}
while(isdigit(ch)) x=x*10+ch-'0',ch=gc();
return x*f;
}
const int N=1e6+10;
int n,m,Q,b[N],L[N],R[N],p[N];
inline void gao(int x){
int l=x,r=x;
while(1){
if (l>1&&(!b[l-1]||b[l-1]>=l&&b[l-1]<=r)){
--l;r=max(r,R[l]);l=min(L[l],l);
continue;
}
if (r<n&&(!b[r]||l<=b[r]&&b[r]<=r)){
++r;l=min(L[r],l);r=max(r,R[r]);
continue;
}break;
}L[x]=l;R[x]=r;
}
int main(){
freopen("bzoj5288.in","r",stdin);
srand(20010820);
n=read();m=read();Q=read();
for (int i=1;i<=m;++i) b[read()]=read();
for (int i=1;i<=n;++i) L[i]=n+1,p[i]=i;
for (int i=1;i<=5;++i) random_shuffle(p+1,p+n+1);
for (int i=1;i<=n;++i) gao(p[i]);
while(Q--){
int s=read(),t=read();
if (t<=R[s]&&t>=L[s]) puts("YES");else puts("NO");
}
return 0;
}