//根据顺序,连向最近下一个,然后倍增,找到长度n的位置,然后离线排序优先队列优先就行了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
int n,m,tq;
const int N=200005;
int p[N],a[N];
int nxt[N];
int near[N];
int dp[N][21];
struct node
{
int l,r;
friend bool operator<(node x,node y)
{
return x.r>y.r;
}
};
struct node1
{
int l,r,id;
friend bool operator<(node1 x,node1 y)
{
return x.l<y.l;
}
}itm[N];
int get(int sta)
{
int tar=sta+n-1;
if(tar>m)
return 0;
int dis=n-1,cur=sta;
for(int j=20;j>=0;j--)
{
if(dis>=(1<<j))
{
cur=dp[cur][j];
dis-=(1<<j);
if(dis==0)
break;
}
}
return cur;
}
int main() {
while(~scanf("%d%d%d",&n,&m,&tq))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++)
{
if(i!=n)
nxt[p[i]]=p[i+1];
else
nxt[p[i]]=p[1];
}
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
memset(near,0, sizeof(near));
memset(dp,0,sizeof(dp));
for(int i=m;i>=1;i--)
{
int nval=nxt[a[i]];
int nid=near[nval];
dp[i][0]=nid;
near[a[i]]=i;
}
for(int j=1;j<=20;j++)
{
for(int i=1;i<=m;i++)
{
dp[i][j]=dp[dp[i][j-1]][j-1];
}
}
priority_queue<node> q;
for(int i=1;i<=m;i++)
{
int tp=get(i);
if(tp!=0)
{
node cur;cur.l=i;cur.r=tp;
q.push(cur);
//cout<<i<<" "<<tp<<endl;
}
}
for(int i=0;i<tq;i++)
{
scanf("%d%d",&itm[i].l,&itm[i].r);
itm[i].id=i;
}
sort(itm,itm+tq);
int ans[N];
for(int i=0;i<tq;i++)
{
int l=itm[i].l;
int r=itm[i].r;
int id=itm[i].id;
//cout<<id<<endl;
while(!q.empty() && q.top().l<l)
{
q.pop();
}
if(q.empty() || q.top().r>r)
ans[id]=0;
else
ans[id]=1;
}
for(int i=0;i<tq;i++)
printf("%d",ans[i]);
printf("\n");
}
return 0;
}