#include <bits/stdc++.h> #include <iostream> #include <algorithm> #include <vector> #include <map> using namespace std; #define pb push_back #define mp make_pair #define INF 1e18 #define mod 1000000007 #define eps 1e-6 #define abs(x) ((x)>=0?(x):-(x)) #define y1 solai #define fi first #define se second typedef long long ll; void read(ll &x) { scanf("%lld",&x); } void read(ll &x, ll &y) { scanf("%lld%lld",&x,&y); } void read(ll &x, ll &y, ll &z) { scanf("%lld%lld%lld",&x,&y,&z); } void print(ll x) { printf("%lld ",x); } void println(ll x) { printf("%lld\n",x); } const ll N=100000,len=20; ll n,m,p,a[N+10],t[len][3*N+10],z[len][3*N+10],ans,l,r,ty; void push(ll ty, ll v, ll l, ll r, ll mid) { if(z[ty][v]==0) return; z[ty][v*2]^=1; z[ty][v*2+1]^=1; t[ty][v*2]=mid-l+1-t[ty][v*2]; t[ty][v*2+1]=r-mid-t[ty][v*2+1]; z[ty][v]=0; } void upd(ll ty, ll v, ll l, ll r, ll x, ll y, ll k) { if(x>y||x>r||y<l) return; if(x<=l&&r<=y) { z[ty][v]^=k; t[ty][v]=r-l+1-t[ty][v]; return; } ll mid=(l+r)/2; push(ty,v,l,r,mid); upd(ty,v*2,l,mid,x,y,k); upd(ty,v*2+1,mid+1,r,x,y,k); t[ty][v]=t[ty][v*2]+t[ty][v*2+1]; } ll sum(ll ty, ll v, ll l, ll r, ll x, ll y) { if(x>y||x>r||y<l) return 0; if(x<=l&&r<=y) return t[ty][v]; ll mid=(l+r)/2; push(ty,v,l,r,mid); return sum(ty,v*2,l,mid,x,y)+sum(ty,v*2+1,mid+1,r,x,y); } int main() { //freopen("c.cpp","r",stdin); cin>>n>>m>>p; for(ll i=1;i<=n;i++) { read(a[i]); for(ll j=0;j<len;j++) if((a[i]>>j)&1) upd(j,1,1,n,max(1LL,i-p+1),i,1); } for(ll i=1;i<=m;i++) { read(ty,l,r); if(ty==1) { for(ll j=0;j<len;j++) if((r>>j)&1) upd(j,1,1,n,max(1LL,l-p+1),l,1); } else { ans=0; for(ll j=0;j<len;j++) { ans+=(1LL<<j)*sum(j,1,1,n,l,min(r,n-p+1)); } printf("%lld\n",ans); } } }