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