#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define EB emplace_back
#define MP make_pair
#define all(o) (o).begin(), (o).end()
#define mset(m,v) memset(m,v,sizeof(m))
#define fr(i,n) for(lli i=0;i<n;++i)
#define rep(i,a,b) for(lli i=a;i<=b;++i)
#define per(i,b,a) for(lli i=b;i>=a;--i)
#define remin(a,b) (a=min((a),(b)))
#define remax(a,b) (a=max((a),(b)))
#define chartostr(x) string(1,(char)(x))
#define fastIO ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
typedef long int li;typedef long long int lli;typedef long double ld;
typedef pair< lli,lli > ii;typedef pair<lli,ii> edge;
typedef vector<lli> vi;typedef vector<ii> vii;typedef vector<edge> edgelist;
typedef vector<vi> graph;lli MOD=1000000007;long double EPS=1e-9;
#define debarr(a,n) for(int i=0;i<n;i++) cerr<<a[i]<<" "; cerr<<endl;
#define debmat(mat,row,col) for(int i=0;i<row;i++) {for(int j=0;j<col;j++) cerr<<mat[i][j]<<" ";cerr<<endl;}
#define pr(...) dbs(#__VA_ARGS__, __VA_ARGS__)
template <class S, class T>ostream& operator <<(ostream& os, const pair<S, T>& p) {return os << "(" << p.first << ", " << p.second << ")";}
template <class T>ostream& operator <<(ostream& os, const vector<T>& p) {os << "[ "; for (auto& it : p) os << it << " "; return os << "]";}
template <class T>ostream& operator <<(ostream& os, const unordered_set<T>& p) {os << "[ "; for (auto& it : p) os << it << " "; return os << "]";}
template <class S, class T>ostream& operator <<(ostream& os, const unordered_map<S, T>& p) {os << "[ "; for (auto& it : p) os << it << " "; return os << "]";}
template <class T>ostream& operator <<(ostream& os, const set<T>& p) {os << "[ "; for (auto& it : p) os << it << " "; return os << "]";}
template <class S, class T>ostream& operator <<(ostream& os, const map<S, T>& p) {os << "[ "; for (auto& it : p) os << it << " "; return os << "]";}
template <class T> void dbs(string str, T t) {cerr << str << " : " << t << "\n";}
template <class T, class... S> void dbs(string str, T t, S... s) {int idx = str.find(','); cerr << str.substr(0, idx) << " : " << t << ","; dbs(str.substr(idx + 1), s...);}
template <class T> void prc(T a, T b) {cerr << "["; for (T i = a; i != b; ++i) {if (i != a) cerr << ", "; cerr << *i;} cerr << "]\n";}

void pre(){

}

lli t[400400][21];
bool lazy[400400][21];
lli arr[100100];

void push(int id,int l,int r,int p){
	if(lazy[id][p]){
		t[id][p]=r-l+1-t[id][p];
		if(l!=r){
			lazy[id<<1][p]^=1;
			lazy[id<<1|1][p]^=1;
		}
		lazy[id][p]=0;
	}
}

void build(int id,int l,int r,int p){
	if(l==r){
		t[id][p]=(((1<<p)&(arr[l]))>0);
		lazy[id][p]=0;
		return;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid,p);
	build(id<<1|1,mid+1,r,p);
	t[id][p]=t[id<<1][p]+t[id<<1|1][p];
}

void update(int id,int l,int r,int p,int lq,int rq){
	push(id,l,r,p);
	if(l>r||lq>r||l>rq)return;
	if(lq<=l&&r<=rq){
		lazy[id][p]^=1;
		push(id,l,r,p);
		return;
	}
	int mid=(l+r)>>1;
	update(id<<1,l,mid,p,lq,rq);
	update(id<<1|1,mid+1,r,p,lq,rq);
	t[id][p]=t[id<<1][p]+t[id<<1|1][p];
}

int count(int id,int l,int r,int p,int lq,int rq){
	push(id,l,r,p);
	if(l>r||lq>r||l>rq)return 0;
	if(lq<=l&&r<=rq){
		return t[id][p];
	}
	int mid=(l+r)>>1;
	return count(id<<1,l,mid,p,lq,rq)+count(id<<1|1,mid+1,r,p,lq,rq);
}

void solve(){
	lli n,m,p,a,b,c,d;
	cin>>n>>m>>p;
	lli temp[100100];
	fr(i,n)cin>>temp[i];
	lli ttt=n-p+1;
	int cnt=0;
	lli ans=0;
	for(int i=0;i<p-1;i++){
		ans^=temp[i];
	}
	int cur=p-1;
	int lass=0;
	while(cnt<ttt){
		ans^=temp[cur];
		cur++;
		arr[cnt]=ans;
		cnt++;
		ans^=temp[lass];
		lass++;
	}
	//debarr(arr,ttt);
	fr(i,21)build(1,0,ttt-1,i);
	fr(i,m){
		int a,b,c;
		cin>>a>>b;
		//pr(a,b,c);
		b--;
		if(a==2){
			cin>>c;
			c--;
			lli ans=0;
			fr(i,21){
				ans+=count(1,0,ttt-1,i,b,c)*(1LL<<i);
			}
			cout<<ans<<endl;
		}
		else{
			cin>>d;
			fr(i,21){
				if((1<<i)&d){
					update(1,0,ttt-1,i,b-p+1,b);
				}
			}
		}
	}
}

int main(){
	fastIO;
	pre();
	int t=1;
	//cin>>t;
	for(int i=1;i<=t;i++){
		solve();
	}
}