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