#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int N=2e5+5,inf=1e9;
int t,n,q,K,a[N],b[N],pre1[100],pre2[100];
struct qwq{int sum,val;};
bool cmp1(qwq x,qwq y){return x.sum<y.sum;}
bool cmp2(qwq x,qwq y){return x.sum>y.sum;}
#define lc k<<1
#define rc k<<1|1
#define ls lc,l,mid
#define rs rc,mid+1,r
struct node{
vector<qwq>lmax,rmax;
int sum,minn,maxx;
}tree[N<<2];
node ans,las;
void pre(int k,int l,int r){
if(l==r){
tree[k].maxx=a[l];
tree[k].minn=inf,tree[k].sum=b[l];
if(b[l]>=K) tree[k].minn=a[l];
tree[k].lmax.clear();
tree[k].lmax.push_back(qwq{b[l],a[l]});
tree[k].rmax.clear();
tree[k].rmax.push_back(qwq{b[l],a[l]});
return ;
}
int mid=l+r>>1;
pre(ls);pre(rs);
tree[k].lmax.clear();
tree[k].rmax.clear();
tree[k].maxx=max(tree[lc].maxx,tree[rc].maxx);
for(auto v:tree[lc].lmax) tree[k].lmax.push_back(v);
for(auto v:tree[rc].lmax){
if((tree[lc].sum|v.sum)==tree[lc].sum) continue;
tree[k].lmax.push_back(qwq{tree[lc].sum|v.sum,max(tree[lc].maxx,v.val)});
}
for(auto v:tree[rc].rmax) tree[k].rmax.push_back(v);
for(auto v:tree[lc].rmax){
if((tree[rc].sum|v.sum)==tree[rc].sum) continue;
tree[k].rmax.push_back(qwq{v.sum|tree[rc].sum,max(v.val,tree[rc].maxx)});
}
tree[k].minn=min(tree[lc].minn,tree[rc].minn);
pre1[0]=tree[lc].rmax[0].val;
pre2[0]=tree[rc].lmax[0].val;
for(int i=1;i<tree[lc].rmax.size();i++)
pre1[i]=max(pre1[i-1],tree[lc].rmax[i].val);
for(int i=1;i<tree[rc].lmax.size();i++)
pre2[i]=max(pre2[i-1],tree[rc].lmax[i].val);
for(int r1=0,r2=tree[rc].lmax.size()-1;r1<tree[lc].rmax.size();r1++){
while((r2>0)&&((tree[lc].rmax[r1].sum|tree[rc].lmax[r2-1].sum)>=K))
r2--;
if((tree[lc].rmax[r1].sum|tree[rc].lmax[r2].sum)>=K)
tree[k].minn=min(tree[k].minn,max(pre1[r1],pre2[r2]));
}
tree[k].sum=tree[lc].sum|tree[rc].sum;
}
void change(int k,int l,int r,int x,int d){
if(l==r){
b[l]=d;
tree[k].maxx=a[l];
tree[k].minn=inf,tree[k].sum=b[l];
if(b[l]>=K) tree[k].minn=a[l];
tree[k].lmax.clear();
tree[k].lmax.push_back(qwq{b[l],a[l]});
tree[k].rmax.clear();
tree[k].rmax.push_back(qwq{b[l],a[l]});
return ;
}
int mid=l+r>>1;
if(x<=mid) change(ls,x,d);
else change(rs,x,d);
tree[k].lmax.clear();
tree[k].rmax.clear();
tree[k].maxx=max(tree[lc].maxx,tree[rc].maxx);
for(auto v:tree[lc].lmax) tree[k].lmax.push_back(v);
for(auto v:tree[rc].lmax){
if((tree[lc].sum|v.sum)==tree[lc].sum) continue;
tree[k].lmax.push_back(qwq{tree[lc].sum|v.sum,max(tree[lc].maxx,v.val)});
}
for(auto v:tree[rc].rmax) tree[k].rmax.push_back(v);
for(auto v:tree[lc].rmax){
if((tree[rc].sum|v.sum)==tree[rc].sum) continue;
tree[k].rmax.push_back(qwq{v.sum|tree[rc].sum,max(v.val,tree[rc].maxx)});
}
tree[k].minn=min(tree[lc].minn,tree[rc].minn);
pre1[0]=tree[lc].rmax[0].val;
pre2[0]=tree[rc].lmax[0].val;
for(int i=1;i<tree[lc].rmax.size();i++)
pre1[i]=max(pre1[i-1],tree[lc].rmax[i].val);
for(int i=1;i<tree[rc].lmax.size();i++)
pre2[i]=max(pre2[i-1],tree[rc].lmax[i].val);
for(int r1=0,r2=tree[rc].lmax.size()-1;r1<tree[lc].rmax.size();r1++){
while((r2>0)&&((tree[lc].rmax[r1].sum|tree[rc].lmax[r2-1].sum)>=K))
r2--;
if((tree[lc].rmax[r1].sum|tree[rc].lmax[r2].sum)>=K)
tree[k].minn=min(tree[k].minn,max(pre1[r1],pre2[r2]));
}
tree[k].sum=tree[lc].sum|tree[rc].sum;
}
void query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y){
if(x==l) ans=tree[k];
else{
las=ans;
ans.lmax.clear();
ans.rmax.clear();
ans.maxx=max(las.maxx,tree[k].maxx);
for(auto v:las.lmax) ans.lmax.push_back(v);
for(auto v:tree[k].lmax){
if((las.sum|v.sum)==las.sum) continue;
ans.lmax.push_back(qwq{las.sum|v.sum,max(las.maxx,v.val)});
}
for(auto v:tree[k].rmax) ans.rmax.push_back(v);
for(auto v:las.rmax){
if((tree[k].sum|v.sum)==tree[k].sum) continue;
ans.rmax.push_back(qwq{v.sum|tree[k].sum,max(v.val,tree[k].maxx)});
}
ans.minn=min(las.minn,tree[k].minn);
pre1[0]=las.rmax[0].val;
pre2[0]=tree[k].lmax[0].val;
for(int i=1;i<las.rmax.size();i++)
pre1[i]=max(pre1[i-1],las.rmax[i].val);
for(int i=1;i<tree[k].lmax.size();i++)
pre2[i]=max(pre2[i-1],tree[k].lmax[i].val);
for(int r1=0,r2=tree[k].lmax.size()-1;r1<las.rmax.size();r1++){
while((r2>0)&&((las.rmax[r1].sum|tree[k].lmax[r2-1].sum)>=K))
r2--;
if((las.rmax[r1].sum|tree[k].lmax[r2].sum)>=K)
ans.minn=min(ans.minn,max(pre1[r1],pre2[r2]));
}
ans.sum=las.sum|tree[k].sum;
}
return ;
}
int mid=l+r>>1;
if(x<=mid) query(ls,x,y);
if(mid<y) query(rs,x,y);
}
char *p1,*p2,buf[1000005];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)
int read(){
int x=0,f=1;char ch=nc();
while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
while(ch>=48&&ch<=57){x=x*10+ch-48,ch=nc();}
return x*f;
}
int main(){
t=read();
while(t--){
n=read();K=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) b[i]=read();
pre(1,1,n);
q=read();
int op,x,y;
while(q--){
op=read();x=read();y=read();
if(op==1) change(1,1,n,x,y);
else{
ans.sum=0,ans.minn=ans.maxx=inf;
ans.lmax.clear();
ans.rmax.clear();
query(1,1,n,x,y);
if(ans.minn==inf) printf("-1 ");
else printf("%d ",ans.minn);
}
}
puts("");
}
return 0;
}