#include<bits/stdc++.h> #define lf double #define ll long long #define cc pair<char,char> #define ull unsigned ll #define ii pair<int,int> #define li pair<ll,int> #define iii pair<int,ii> #define iiii pair<ii,ii> #define iiii2 pair<int,iii> #define lii pair<ll,ii> #define lolo pair<ll,ll> #define heap priority_queue #define mp make_pair #define st first #define nd second #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define all(x) x.begin(),x.end() #define len(x) strlen(x) #define sz(x) (int) x.size() #define orta ((bas+son)/2) #define min3(x,y,z) min(min(x,y),z) #define max3(x,y,z) max(max(x,y),z) #define umin(x,y) x=min(x,y) #define umax(x,y) x=max(x,y) #define dbgs(x) cerr<<(#x)<<" --> "<<(x)<<" " #define dbg(x) cerr<<(#x)<<" --> "<<(x)<<endl;getchar() #define MOD 998244353 #define inf 1000000000000000000 #define M 10000002 #define N 100005 #define LOG 20 #define magic 100 #define KOK 250 #define EPS 0.0025 #define pw(x) ((1ll)<<(x)) #define PI 3.1415926535 using namespace std; int a[N],n,q,p,x,y,t; ll S[21][N*4]; int lazy[21][N*4],P[N]; void push(int node,int bas,int son,int b) { if(lazy[b][node]&1) { S[b][node*2]=1ll*pw(b)*(orta-bas+1)-S[b][node*2]; S[b][node*2+1]=1ll*pw(b)*(son-orta)-S[b][node*2+1]; lazy[b][node*2]+=lazy[b][node]; lazy[b][node*2+1]+=lazy[b][node]; } lazy[b][node]=0; } ll get(int node,int bas,int son,int x,int y,int b) { if(bas>y || son<x) return 0; if(bas>=x && son<=y) { return S[b][node]; } push(node,bas,son,b); return get(node*2,bas,orta,x,y,b)+get(node*2+1,orta+1,son,x,y,b); } void up(int node,int bas,int son,int x,int y,int b) { if(bas>y || son<x) return ; if(bas>=x && son<=y) { S[b][node]=1ll*pw(b)*(son-bas+1)-S[b][node]; lazy[b][node]++; return ; } push(node,bas,son,b); up(node*2,bas,orta,x,y,b); up(node*2+1,orta+1,son,x,y,b); S[b][node]=S[b][node*2]+S[b][node*2+1]; } void update(int x,int y) { int l=max(1,x-p+1),r=min(x,n-p+1); for(int i=LOG;i>=0;i--) { if(pw(i)&y) { up(1,1,n,l,r,i); } } } void build(int node,int bas,int son,int b) { if(bas==son) { S[b][node]=pw(b)&P[bas]; return ; } build(node*2,bas,orta,b); build(node*2+1,orta+1,son,b); S[b][node]=S[b][node*2]+S[b][node*2+1]; } int main() { #if 0 freopen("input.txt","r",stdin); #endif scanf("%d %d %d",&n,&q,&p); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } int last=0; int xr=0; for(int i=1;i<=n;i++) { while(last+1<=n && i+p-1>last) { last++; xr^=a[last]; } P[i]=xr; xr^=a[i]; } for(int i=LOG;i>=0;i--) { build(1,1,n,i); } while(q--) { scanf("%d %d %d",&t,&x,&y); if(t==1) { update(x,y); } else { ll res=0; y=min(y,n-p+1); for(int i=LOG;i>=0;i--) { res+=get(1,1,n,x,y,i); } printf("%lld\n",res); } } }