#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
struct node {
int lc,rc,l,r,dif;
} tr[N*4];
int t,k,m,n;
int l,r,x,lst,xx,opt,a[N],p[30];
void js() {
n=1;
for(int i=1;i<=k;i++) n*=2;
}
void build(int pos,int l,int r) {
tr[pos].l=l,tr[pos].r=r;
if(l==r) {
tr[pos].lc=tr[pos].rc=a[l];
tr[pos].dif=1;
return;
}
int mid=(l+r)/2;
build(pos*2,l,mid);
build(pos*2+1,mid+1,r);
tr[pos].dif=tr[pos*2].dif+tr[pos*2+1].dif;
if(tr[pos*2].rc==tr[pos*2+1].lc) tr[pos].dif--;
tr[pos].lc=tr[pos*2].lc,tr[pos].rc=tr[pos*2+1].rc;
}
int sch(int pos,int l,int r,int w,int &lc,int &rc) {
if(tr[pos].l==tr[pos].r) {
lc=a[tr[pos].l^x],rc=a[tr[pos].r^x];
return tr[pos].dif;
}
if(p[w]) {
int mid=(tr[pos].l+tr[pos].r)/2,dif=0,l1,r1,l2,r2;
tr[pos*2+1].l=tr[pos].l,tr[pos*2+1].r=mid;
tr[pos*2].l=mid+1,tr[pos*2].r=tr[pos].r;
l1=r1=l2=r2=-1;
if(mid>=l) dif+=sch(pos*2+1,l,r,w-1,l1,r1);
if(mid+1<=r) dif+=sch(pos*2,l,r,w-1,l2,r2);
if(r1==l2&&r1!=-1) dif--;
lc=l1,rc=r2;
if(lc==-1) lc=l2;
if(rc==-1) rc=r1;
tr[pos*2].l=tr[pos].l,tr[pos*2].r=mid;
tr[pos*2+1].l=mid+1,tr[pos*2+1].r=tr[pos].r;
return dif;
} else {
int mid=(tr[pos].l+tr[pos].r)/2,dif=0,l1,r1,l2,r2;
tr[pos*2].l=tr[pos].l,tr[pos*2].r=mid;
tr[pos*2+1].l=mid+1,tr[pos*2+1].r=tr[pos].r;
l1=r1=l2=r2=-1;
if(mid>=l) dif+=sch(pos*2,l,r,w-1,l1,r1);
if(mid+1<=r) dif+=sch(pos*2+1,l,r,w-1,l2,r2);
if(r1==l2&&r1!=-1) dif--;
lc=l1,rc=r2;
if(lc==-1) lc=l2;
if(rc==-1) rc=r1;
return dif;
}
}
int main() {
cin>>t>>k>>m;
js();
for(int i=0;i<n;i++) cin>>a[i];
build(1,0,n-1);
for(int i=1;i<=m;i++) {
cin>>opt;
if(opt==1) {
cin>>xx;
x=(x^xx^(t*lst));
} else {
cin>>l>>r;
l^=(t*lst);r^=(t*lst);
if(l>r) swap(l,r);
int cyc=x,ycy;
while(cyc) {
p[++p[0]]=cyc%2;
cyc/=2;
}
lst=sch(1,l,r,k,cyc,ycy);
cout<<lst<<endl;
for(int i=1;i<=p[0];i++) p[i]=0;
}
}
}