#include <bits/stdc++.h> using namespace std; #define SPEED ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) #define fileio freopen("in.in", "r", stdin),freopen("out.out", "w", stdout); #define ll long long int #define FF first #define SS second #define mp make_pair #define pb push_back #define pii pair<int,int> #define pll pair<long long int,long long int> #define sd(x) scanf("%d",&x) #define slld(x) scanf("%lld",&x) #define pd(x) printf("%d\n",x) #define plld(x) printf("%lld\n",x) #define pss printf #define MOD 1000000007 #define INF 1e18 #define eps 0.00001 #define endl '\n' #define debug(n1) cout<<n1<<endl ll n,m,a[100005],p; ll b[100005]; ll c[100005]; ll tree[20][400005]; ll lazy[20][400005]; void lazify(ll s,ll e,ll i,ll j) { if(lazy[j][i]) { tree[j][i]=(e-s+1)-tree[j][i]; if(s!=e) { lazy[j][2*i]^=lazy[j][i]; lazy[j][2*i+1]^=lazy[j][i]; } lazy[j][i]=0; } } void upd(ll l,ll r,ll s,ll e,ll i,ll j) { if(l>r)return; lazify(s,e,i,j); if(s>r||e<l)return; if(s>=l&&e<=r) { lazy[j][i]^=1; lazify(s,e,i,j); return; } ll mid=(s+e)>>1; upd(l,r,s,mid,2*i,j); upd(l,r,mid+1,e,2*i+1,j); tree[j][i]=tree[j][2*i]+tree[j][2*i+1]; } ll query(ll l,ll r,ll s,ll e,ll i,ll j) { if(s>r||e<l||l>r)return 0; lazify(s,e,i,j); if(s>=l&&e<=r) return (tree[j][i]*(1<<j)); ll mid=(s+e)>>1; return query(l,r,s,mid,2*i,j)+query(l,r,mid+1,e,2*i+1,j); } void build(ll l,ll r,ll i) { if(l==r) { for(int j=0;j<20;j++) { if((c[l]&(1<<j))) tree[j][i]++; } } if(l==r)return; ll mid=(l+r)>>1; build(l,mid,2*i); build(mid+1,r,2*i+1); for(int j=0;j<20;j++) tree[j][i]=tree[j][i*2]+tree[j][2*i+1]; } void tak(ll x,ll i) { ll l=max(i-p+1,1ll); ll r=min(i,n-p+1); for(int j=0;j<20;j++) if((x&(1<<j))) { upd(l,r,1,n,1,j); } } ll get(ll l,ll r) { ll ans=0; for(int j=0;j<20;j++) ans=ans+query(l,r,1,n,1,j); return ans; } int main() { SPEED; cin>>n>>m>>p; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=(a[i]^b[i-1]); } for(int i=1;i<=n;i++) { if(i+p-1<=n) c[i]=(b[i+p-1]^b[i-1]); } build(1,n,1); for(int i=1;i<=m;i++) { ll t,l,r,x; cin>>t; if(t==1) { cin>>l>>x; tak(x,l); } else { cin>>l>>r; cout<<get(l,r)<<endl; } } return 0; }