#include using namespace std; int sgt[400400]; int arr[100100]; void build(int nd,int l,int r){ if(l==r){ sgt[nd]=arr[l]; return; } int mid=(r+l)/2; build(2*nd,l,mid); build(2*nd+1,mid+1,r); sgt[nd]=min(sgt[2*nd],sgt[2*nd+1]); } void update(int nd,int l,int r,int ind){ if(l==r){ sgt[nd]=arr[l]; return; } int mid=(r+l)/2; if(ind<=mid){ update(2*nd,l,mid,ind); } else { update(2*nd+1,mid+1,r,ind); } sgt[nd]=min(sgt[2*nd],sgt[2*nd+1]); } int query(int nd,int l,int r,int s,int e){ if(s<=l && r<=e){ return sgt[nd]; } int mid=(r+l)/2; int mn=1<<30; if(s<=mid){ int xx=query(2*nd,l,mid,s,e); mn=min(mn,xx); } if(mid+1<=e){ int xx=query(2*nd+1,mid+1,r,s,e); mn=min(mn,xx); } return mn; } int sgt2[400400]; void build2(int nd,int l,int r){ if(l==r){ sgt2[nd]=arr[l]; return; } int mid=(r+l)/2; build2(2*nd,l,mid); build2(2*nd+1,mid+1,r); sgt2[nd]=(sgt2[2*nd]|sgt2[2*nd+1]); } void update2(int nd,int l,int r,int ind){ if(l==r){ sgt2[nd]=arr[l]; return; } int mid=(r+l)/2; if(ind<=mid){ update2(2*nd,l,mid,ind); } else { update2(2*nd+1,mid+1,r,ind); } sgt2[nd]=(sgt2[2*nd]|sgt2[2*nd+1]); } int get_ind2(int nd,int l,int r,int x){ if(l==r){ return l; } int mid=(r+l)/2; if(sgt2[2*nd] & x){ return get_ind2(2*nd,l,mid,x); } return get_ind2(2*nd+1,mid+1,r,x); } int query2(int nd,int l,int r,int s,int e,int x){ if(s<=l && r<=e){ if(sgt2[nd] & x){ return get_ind2(nd,l,r,x); } else { return -1; } } int mid=(r+l)/2; int mn=-1; if(s<=mid){ mn=query2(2*nd,l,mid,s,e,x); } if(mn!=-1){ return mn; } if(mid+1<=e){ mn=query2(2*nd+1,mid+1,r,s,e,x); } return mn; } int n,m; int mask=(1<<30)-1; //ifstream cin("input09.txt"); //ofstream cout("out09.txt"); int main(){ cin.sync_with_stdio(false); cout.sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>arr[i]; } build(1,1,n); build2(1,1,n); while(m--){ int ty; cin>>ty; if(ty==0){ int l,r; cin>>l>>r; cout<>l>>r>>x; while(true){ int ind=query2(1,1,n,l,r,x ^ mask); if(ind==-1)break; arr[ind] = arr[ind] & x; update(1,1,n,ind); update2(1,1,n,ind); } } } }