#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
using namespace std;
const int N = 100005;
pair<ll,ll>seg[4*N+10];
ll ar[N+3],n,q,k;
pair<ll,ll>com(pair<ll,ll>a,pair<ll,ll>b){
return {a.first+b.first,max(a.second,b.second)};
}
void bd(int i,int l,int r){
if(l==r){
seg[i]={ar[l],ar[l]};
return;
}
int mid=l+(r-l)/2;
bd(i*2,l,mid);
bd(i*2+1,mid+1,r);
seg[i]=com(seg[i*2],seg[i*2+1]);
}
void up1(int i,int l,int r,int p,ll x){
if(r<p||l>p)return;
if(r==l&&l==p){
seg[i]={x,x};
return;
}
int mid=l+(r-l)/2;
up1(i*2,l,mid,p,x);
up1(i*2+1,mid+1,r,p,x);
seg[i]=com(seg[i*2],seg[i*2+1]);
}
void up2(int i,int l,int r,int ql,int qr){
if(r<ql||l>qr)return;
if(l>=ql&&r<=qr){
if(seg[i].second<=0)return;
}
if(l==r){
int nx=0;
if(seg[i].first!=0)nx=seg[i].first/k;
seg[i]={nx,nx};
return;
}
int mid=l+(r-l)/2;
up2(i*2,l,mid,ql,qr);
up2(i*2+1,mid+1,r,ql,qr);
seg[i]=com(seg[i*2],seg[i*2+1]);
}
ll que(int i,int l,int r,int ql,int qr){
if(r<ql||l>qr)return 0;
if(l>=ql&&r<=qr)return seg[i].first;
int mid=l+(r-l)/2;
return que(i*2,l,mid,ql,qr)+que(i*2+1,mid+1,r,ql,qr);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>q>>k;
for(int i=1;i<=n;i++){
cin>>ar[i];
}
bd(1,1,n);
while(q--){
int t;cin>>t;
int a,b;cin>>a>>b;
if(t==1){
up1(1,1,n,a,b);
}
else if(t==2){
up2(1,1,n,a,b);
}
else{
cout<<que(1,1,n,a,b)<<endl;
}
}
return 0;
}
/*
5 10 3
1
2
8
1
3
1 2 5
2 3 5
3 2 5
2 1 4
1 3 2
3 3 5
1 2 4
2 1 2
1 1 4
3 1 5
5 6 3
1
2
8
1
3
2 3 5
3 2 5
2 1 4
3 3 5
2 1 2
3 1 5
*/