#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,k,t,x,y,a[100005],tree[400005];
void build(int id,int l,int r){
if(l==r){
tree[id]=a[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id]=tree[id*2]+tree[id*2+1];
}
void update1(int id,int l,int r,int pos,int val){
if(l==r){
tree[id]=val;
return;
}
int mid=(l+r)/2;
if(pos<=mid) update1(id*2,l,mid,pos,val);
else update1(id*2+1,mid+1,r,pos,val);
tree[id]=tree[id*2]+tree[id*2+1];
}
void update2(int id,int l,int r,int u,int v){
if(tree[id]==0||k==1) return;
if(l==r){
tree[id]/=k;
return;
}
int mid=(l+r)/2;
if(u<=mid) update2(id*2,l,mid,u,v);
if(mid<v) update2(id*2+1,mid+1,r,u,v);
tree[id]=tree[id*2]+tree[id*2+1];
}
int getsum(int id,int l,int r,int u,int v){
if(v<l||u>r||u>v) return 0;
if(u<=l&&r<=v){
return tree[id];
}
int mid=(l+r)/2,ans=0;
if(u<=mid) ans+=getsum(id*2,l,mid,u,v);
if(mid<v) ans+=getsum(id*2+1,mid+1,r,u,v);
return ans;
}
signed main(){
scanf("%lld %lld %lld",&n,&q,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(q--){
scanf("%lld %lld %lld",&t,&x,&y);
if(t==1){
update1(1,1,n,x,y);
}if(t==2){
update2(1,1,n,x,y);
}if(t==3){
printf("%lld\n",getsum(1,1,n,x,y));
}
}
}