#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e5+10;
int c,n,m,q,x[N],y[N],tx[N],ty[N];
struct node{
int mx,mn;
};
node prf[N],prg[N],suf[N],sug[N];
#define upd(T,p) (node){T[i]<T[p.mn]?i:p.mn,T[i]>T[p.mx]?i:p.mx}
bool check1(int xx,int yy,int n,int m,int f[],int g[]){
if(xx==1||yy==1)
return true;
node t1=prf[xx-1],t2=prg[yy-1];
if(f[t1.mn]<g[t2.mn])
return check1(t1.mn,yy,n,m,f,g);
if(f[t1.mx]<g[t2.mx])
return check1(xx,t2.mx,n,m,f,g);
return false;
}
bool check2(int xx,int yy,int n,int m,int f[],int g[]){
if(xx==n||yy==m)
return true;
node t1=suf[xx+1],t2=sug[yy+1];
if(f[t1.mn]<g[t2.mn])
return check2(t1.mn,yy,n,m,f,g);
if(f[t1.mx]<g[t2.mx])
return check2(xx,t2.mx,n,m,f,g);
return false;
}
bool sol(int f[],int n,int g[],int m){
if(f[1]>=g[1])
return false;
for(int i=1;i<=n;i++)
prf[i]=(i==1)?(node){1,1}:upd(f,prf[i-1]);
for(int i=1;i<=m;i++)
prg[i]=(i==1)?(node){1,1}:upd(g,prg[i-1]);
for(int i=n;i>=1;i--)
suf[i]=(i==n)?(node){n,n}:upd(f,suf[i+1]);
for(int i=m;i>=1;i--)
sug[i]=(i==m)?(node){m,m}:upd(g,sug[i+1]);
node t1=prf[n],t2=prg[m];
if(f[t1.mn]>=g[t2.mn]||f[t1.mx]>=g[t2.mx])
return false;
return check1(t1.mn,t2.mx,n,m,f,g)&&check2(t1.mn,t2.mx,n,m,f,g);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>c>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>x[i];
tx[i]=x[i];
}
for(int i=1;i<=m;i++){
cin>>y[i];
ty[i]=y[i];
}
bool f1=sol(x,n,y,m);
bool f2=sol(y,m,x,n);
cout<<(f1||f2);
while(q--){
int kx,ky;
cin>>kx>>ky;
while(kx--){
int p,v;
cin>>p>>v;
x[p]=v;
}
while(ky--){
int p,v;
cin>>p>>v;
y[p]=v;
}
bool f1=sol(x,n,y,m);
bool f2=sol(y,m,x,n);
cout<<(f1||f2);
for(int i=1;i<=n;i++)
x[i]=tx[i];
for(int i=1;i<=m;i++)
y[i]=ty[i];
}
return 0;
}