#include <bits/stdc++.h>
using namespace std;
using ll=long long;
#define sz(a) (int)a.size()
#define mk make_pair
#define pii pair<int,int>
int n,q,k;
struct Segment{
vector<int>ma;
vector<ll>st;
Segment(int _n) : st(4*(_n+2)),ma(4*(_n+2)){}
void update_point(int id,int l,int r,int p,int val){
if(l==r){
st[id]=val;
ma[id]=val;
return;
}
int mid=l+r>>1ll;
if(p<=mid) update_point(id*2,l,mid,p,val);
else update_point(id*2+1,mid+1,r,p,val);
st[id]=st[id*2]+st[id*2+1];
ma[id]=max(ma[id*2],ma[id*2+1]);
}
void update_range(int id,int l,int r,int u,int v){
if(r<u ||l>v ||ma[id]==0) return ;
if(r==l){
st[id]/=k;
ma[id]=st[id];
return;
}
int mid=l+r>>1ll;
update_range(id*2,l,mid,u,v);
update_range(id*2+1,mid+1,r,u,v);
st[id]=st[id*2]+st[id*2+1];
ma[id]=max(ma[id*2],ma[id*2+1]);
}
ll get(int id,int l,int r,int u,int v){
if(r<u ||l>v) return 0;
if(u<=l && r<=v) return st[id];
int mid=l+r>>1ll;
return get(id*2,l,mid,u,v)+get(id*2+1,mid+1,r,u,v);
}
};
void solve(){
cin>>n>>q>>k;
Segment tree(n);
for(int i=1;i<=n;++i){
int x;cin>>x;
tree.update_point(1,1,n,i,x);
}
while(q--){
int type,l,r;cin>>type>>l>>r;
if(type==1){
tree.update_point(1,1,n,l,r);
}
else if(type==2){
tree.update_range(1,1,n,l,r);
}
else{
cout<<tree.get(1,1,n,l,r)<<'\n';
}
}
}
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0);
int T=1;
//cin>>T;
while(T--) solve();
}