#include <bits/stdc++.h> // PLEASE

using namespace std;
typedef long long ll;
typedef pair <int, int> pp;
#define MAXN 100005
#define MAXM 1005
#define MAXP 19
#define A first
#define B second
#define MP make_pair
#define PB push_back
const ll INF = 2e9+13;
const ll MOD = 1e9+7;

int vl[MAXN][MAXP];
int sf[MAXN][MAXP];

int N, M, P;

struct ST {
	int cnt[MAXN*4];
	bool flip[MAXN*4];

	void build(int x, int a, int b, int p) {
		if(a == b) {
			if(sf[a][p]) cnt[x] = 1;
			else cnt[x] = 0;
			return;
		}
		int md = (a+b)/2;
		build(x*2, a, md, p);
		build(x*2+1, md+1, b, p);
		cnt[x] = cnt[x*2] + cnt[x*2+1];
	}
	void pd(int x, int l, int r) 
	{
		if(flip[x] == 0) return;
		cnt[x] = r-l+1 - cnt[x];
		if(l != r) {
			flip[2*x] ^= 1;
			flip[2*x+1] ^= 1;
		}
		flip[x] = 0;
	}
	void upd(int x, int a, int b, int lq, int rq) {
		pd(x, a, b);
		if(a > rq || b < lq) return;
		if((lq <= a) && (rq >= b)) {
			flip[x] ^= 1;
			pd(x, a, b);
			return;
		}
		int md = (a+b)/2;
		upd(x*2, a, md, lq, rq); upd(x*2+1, md+1, b, lq, rq);	
		cnt[x] = cnt[x*2] + cnt[x*2+1];
	}
	int qry(int x, int a, int b, int lq, int rq) {
		pd(x, a, b);
		if(a > rq || b < lq) return 0;
		if((lq <= a) && (rq >= b)) return cnt[x];
		int md = (a+b)/2;
		return qry(x*2, a, md, lq, rq) + qry(x*2+1, md+1, b, lq, rq);
	}
};

ST T[MAXP];
	
int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> N >> M >> P;	
	for(int i=0; i<N; i++) {
		int x; cin >> x;
		for(int j=0; j<MAXP; j++) if((1<<j) & x) vl[i][j] = 1;
	}
	
	for(int i=0; i+P-1<N; i++) { // starting here
		for(int j=0; j<MAXP; j++) {
			if(i == 0) for(int k=0; k<P; k++) sf[i][j] ^= vl[k][j];
			else {
				sf[i][j] = sf[i-1][j];
				sf[i][j] ^= vl[i-1][j];
				sf[i][j] ^= vl[i+P-1][j];
			}
		}
	}
	for(int i=0; i<MAXP; i++) T[i].build(1, 0, N-1, i);
	while(M--) {
		int c, a, b;
		cin >> c >> a >> b;
		if(c == 1) {
			--a;
			for(int i=0; i<MAXP; i++) if((1<<i) & b) T[i].upd(1, 0, N-1, max(0, a-P+1), a);			
		}
		if(c == 2) {
			--a, --b;
			b = min(b, N-P);
			ll ret = 0;
			for(int i=0; i<MAXP; i++) {
				ll vl = T[i].qry(1, 0, N-1, a, b);
				ret += vl * (ll)(1<<i);
			}
			cout << ret << endl;
		}
	}
	
	
}