#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; } } }