const int MAXN=1e5+5,MAXM=17;
int root[MAXN],ch[MAXN*20][2],sz[MAXN*20],cnt;
void Insert(int &k,int p,int v,int pos=MAXM-1){
k=++cnt;
sz[k]=sz[p]+1;
if(pos<0)return;
int dir=(v>>pos)&1;
ch[k][!dir]=ch[p][!dir];
Insert(ch[k][dir],ch[p][dir],v,pos-1);
}
int query(int lef,int rig,int v){
int pos=MAXM-1,k1=root[lef-1],k2=root[rig],ans=0;
while(~pos){
int dir=(v>>pos)&1;
if(sz[ch[k2][!dir]]-sz[ch[k1][!dir]])
ans|=(1<<pos),k1=ch[k1][!dir],k2=ch[k2][!dir];
else
k1=ch[k1][dir],k2=ch[k2][dir];
pos--;
}
return ans;
}
struct Query{
int ql,qr,tl,tr,x,id;
}q[MAXN];
struct Upd{
int pos,v,t;
bool operator < (const Upd &b)const{
return pos<b.pos;
}
}upd[MAXN];
int lef[MAXN<<2],rig[MAXN<<2];
vector<int>a[MAXN<<2];
void build(int k,int L,int R){
lef[k]=L,rig[k]=R;
if(L==R)return;
int M=L+R>>1;
build(k<<1,L,M);build(k<<1|1,M+1,R);
}
void update(int k,int L,int R,int v){
if(L<=lef[k]&&rig[k]<=R)
return a[k].push_back(v);
int mid=lef[k]+rig[k]>>1;
if(mid>=L)update(k<<1,L,R,v);
if(mid<R)update(k<<1|1,L,R,v);
}
int opt[MAXN],cur,ans[MAXN];
int Find(int p,int l,int r){
int lef=l,rig=r,mid,ans=l-1;
while(lef<=rig){
mid=lef+rig>>1;
if(upd[opt[mid]].pos<=p)ans=mid,lef=mid+1;
else rig=mid-1;
}
return ans-l+1;
}
void cal(int k,int L,int R){
cnt=cur=0;
_rep(i,L,R)Insert(root[cur+1],root[cur],upd[opt[i]].v),cur++;
_for(i,0,a[k].size()){
int l=Find(q[a[k][i]].ql-1,L,R)+1,r=Find(q[a[k][i]].qr,L,R);
if(l<=r)ans[q[a[k][i]].id]=max(ans[q[a[k][i]].id],query(l,r,q[a[k][i]].x));
}
}
int t1[MAXN],t2[MAXN];
void solve(int k,int L,int R){
if(L>R)return;
cal(k,L,R);
if(lef[k]==rig[k])return;
int cnt1=0,cnt2=0,mid=lef[k]+rig[k]>>1,M=L-1;
_rep(i,L,R){
if(upd[opt[i]].t<=mid)t1[cnt1++]=opt[i];
else t2[cnt2++]=opt[i];
}
_for(i,0,cnt1)opt[++M]=t1[i];
_for(i,0,cnt2)opt[M+1+i]=t2[i];
solve(k<<1,L,M);solve(k<<1|1,M+1,R);
}
int main()
{
int n=read_int(),m=read_int(),cnt1=0,cnt2=0,k;
_rep(i,1,n)Insert(root[i],root[i-1],read_int());
while(m--){
k=read_int();
if(k==0){
cnt1++;
upd[cnt1].pos=read_int(),upd[cnt1].v=read_int(),upd[cnt1].t=cnt1,opt[cnt1]=cnt1;
}
else{
cnt2++;
q[cnt2].ql=read_int(),q[cnt2].qr=read_int(),q[cnt2].x=read_int(),q[cnt2].id=cnt2;
q[cnt2].tl=max(1,cnt1-read_int()+1),q[cnt2].tr=cnt1;
ans[cnt2]=query(q[cnt2].ql,q[cnt2].qr,q[cnt2].x);
}
}
if(!cnt1){
_rep(i,1,cnt2)enter(ans[i]);
return 0;
}
build(1,1,cnt1);
_rep(i,1,cnt2)if(q[i].tl<=q[i].tr)
update(1,q[i].tl,q[i].tr,i);
sort(upd+1,upd+cnt1+1);
solve(1,1,cnt1);
_rep(i,1,cnt2)enter(ans[i]);
return 0;
}