\(CF1142B\) \(Lynyrd Skynyrd\)c++
分析性質加無修區間最大。spa
考慮找到\(A\)中每一個數在\(P\)中的前驅在\(A\)中的位置。code
那麼咱們的一個循環移位就至關因而以一個數爲開頭,向前跳\(n-1\)步。get
倍增求出一個數向前跳\(n-1\)步的位置,維護一下區間最大值。it
若是區間最大\(\geq L\),就輸出\(1\),不然爲\(0\)。class
其實咱們還能夠將他看爲一棵樹,由於沒有強制在線,咱們就能夠用棧\(\mathcal{O}(n)\)求出其\(n-1\)級祖先。循環
#include<bits/stdc++.h> using namespace std; inline int read() { int f=1,w=0;char x=0; while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();} while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();} return w*f; } const int N=4e5+10; int n,m,Q; int A[N],P[N],Las[N],Id[N]; int f[N][25],Max[N][25],Log[N]; int main(){ #ifndef ONLINE_JUDGE freopen("A.in","r",stdin); #endif n=read(),m=read(),Q=read(); for(int i=1;i<=n;i++) P[i]=read(); for(int i=1;i<=m;i++) A[i]=read(); for(int i=1;i<=n;i++) Las[P[i]]=P[i-1],Las[P[1]]=P[n]; for(int i=2;i<=N-10;i++) Log[i]=Log[i>>1]+1; for(int i=1;i<=m;i++) f[i][0]=Id[Las[A[i]]],Id[A[i]]=i; for(int j=1;j<=Log[n];j++) for(int i=1;i<=m;i++) f[i][j]=f[f[i][j-1]][j-1]; for(int i=1;i<=m;i++) { int S=0;Max[i][0]=i; for(int j=Log[n-1];j>=0;j--) if(S+(1<<j)<=n-1) Max[i][0]=f[Max[i][0]][j],S+=(1<<j); } for(int j=1;j<=Log[m];j++) for(int i=1;i+(1<<j)-1<=m;i++) Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]); while(Q--) { int L=read(),R=read(),X=Log[R-L+1]; int End=max(Max[L][X],Max[R-(1<<X)+1][X]); End>=L?printf("1"):printf("0"); } return 0; }