//segment trees
#include <bits/stdc++.h>
using namespace std;
#define maxi 500005
#define ll long long
int st[maxi];
ll arr[maxi/5+5];
void init(int lo,int hi,int idx){
if(lo==hi){
st[idx]=(arr[lo]&(arr[lo]-1))?0:1;
return ;
}
init(lo,((lo+hi)>>1),2*idx);
init(((lo+hi)>>1)+1,hi,2*idx+1);
st[idx]=st[2*idx]+st[2*idx+1];
}
int query(int lo,int hi,int x,int y,int idx){
if(x>hi || y<lo || lo>hi)return 0;
if(lo>=x && hi<=y){
return st[idx];
}
int mid=(lo+hi)>>1;
int t1=query(lo,mid,x,y,2*idx);
int t2=query(mid+1,hi,x,y,2*idx+1);
return t1+t2;
}
void update(int lo,int hi,int x,int y,int z,int idx){
if(x>hi || y<lo || lo>hi)return ;
if(lo==x && hi==y){
st[idx]= (y-x+1)*((z&(z-1))?0:1);
return;
}
int mid=(lo+hi)>>1;
if(mid>=y)update(lo,mid,x,y,z,2*idx);
else if(x>mid)update(mid+1,hi,x,y,z,2*idx+1);
else{
update(lo,mid,x,mid,z,2*idx);
update(mid+1,hi,mid+1,y,z,2*idx+1);
}
st[idx]=st[2*idx]+st[2*idx+1];
}
int main(){
int n,q,i;
scanf("%d%d",&n,&q);
//ll ele;
for(i=1;i<=n;i++){
scanf("%lld",&arr[i]);
}
init(1,n,1);
//for(i=0;i<10;i++)cout<<st[i]<<" ";
while(q--){
int t,x,y,z;
scanf("%d%d%d",&t,&x,&y);
x++;y++;
if(t==1){//query
printf("%d\n",query(1,n,x,y,1));
}
else{//upd
scanf("%d",&z);
update(1,n,x,y,z,1);
}
}
return 0;
}
Ly9zZWdtZW50IHRyZWVzCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIG1heGkgNTAwMDA1CiNkZWZpbmUgbGwgbG9uZyBsb25nCmludCBzdFttYXhpXTsKbGwgYXJyW21heGkvNSs1XTsKdm9pZCBpbml0KGludCBsbyxpbnQgaGksaW50IGlkeCl7CglpZihsbz09aGkpewoJCXN0W2lkeF09KGFycltsb10mKGFycltsb10tMSkpPzA6MTsKCQlyZXR1cm4gOwoJCX0KCWluaXQobG8sKChsbytoaSk+PjEpLDIqaWR4KTsKCWluaXQoKChsbytoaSk+PjEpKzEsaGksMippZHgrMSk7CglzdFtpZHhdPXN0WzIqaWR4XStzdFsyKmlkeCsxXTsKCX0KaW50IHF1ZXJ5KGludCBsbyxpbnQgaGksaW50IHgsaW50IHksaW50IGlkeCl7CglpZih4PmhpIHx8IHk8bG8gfHwgbG8+aGkpcmV0dXJuIDA7CglpZihsbz49eCAmJiBoaTw9eSl7CgkJcmV0dXJuIHN0W2lkeF07CgkJfQoJaW50IG1pZD0obG8raGkpPj4xOwoJaW50IHQxPXF1ZXJ5KGxvLG1pZCx4LHksMippZHgpOwoJaW50IHQyPXF1ZXJ5KG1pZCsxLGhpLHgseSwyKmlkeCsxKTsKCXJldHVybiB0MSt0MjsKCX0Kdm9pZCB1cGRhdGUoaW50IGxvLGludCBoaSxpbnQgeCxpbnQgeSxpbnQgeixpbnQgaWR4KXsKCWlmKHg+aGkgfHwgeTxsbyB8fCBsbz5oaSlyZXR1cm4gOwoJaWYobG89PXggJiYgaGk9PXkpewoJCXN0W2lkeF09ICh5LXgrMSkqKCh6Jih6LTEpKT8wOjEpOwoJCXJldHVybjsKCQl9CglpbnQgbWlkPShsbytoaSk+PjE7CglpZihtaWQ+PXkpdXBkYXRlKGxvLG1pZCx4LHkseiwyKmlkeCk7CgllbHNlIGlmKHg+bWlkKXVwZGF0ZShtaWQrMSxoaSx4LHkseiwyKmlkeCsxKTsKCWVsc2V7CgkJdXBkYXRlKGxvLG1pZCx4LG1pZCx6LDIqaWR4KTsKCQl1cGRhdGUobWlkKzEsaGksbWlkKzEseSx6LDIqaWR4KzEpOwoJCX0KCXN0W2lkeF09c3RbMippZHhdK3N0WzIqaWR4KzFdOwoJfQppbnQgbWFpbigpewoJaW50IG4scSxpOwoJc2NhbmYoIiVkJWQiLCZuLCZxKTsKCS8vbGwgZWxlOwoJZm9yKGk9MTtpPD1uO2krKyl7CgkJc2NhbmYoIiVsbGQiLCZhcnJbaV0pOwoJCX0KCWluaXQoMSxuLDEpOwoJLy9mb3IoaT0wO2k8MTA7aSsrKWNvdXQ8PHN0W2ldPDwiICI7Cgl3aGlsZShxLS0pewoJCWludCB0LHgseSx6OwoJCXNjYW5mKCIlZCVkJWQiLCZ0LCZ4LCZ5KTsKCQl4Kys7eSsrOwoJCWlmKHQ9PTEpey8vcXVlcnkKCQkJcHJpbnRmKCIlZFxuIixxdWVyeSgxLG4seCx5LDEpKTsKCQkJfQoJCWVsc2V7Ly91cGQKCQkJc2NhbmYoIiVkIiwmeik7CgkJCXVwZGF0ZSgxLG4seCx5LHosMSk7CgkJCX0KCQl9CglyZXR1cm4gMDsKCX0K