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