#include <bits/stdc++.h>
using namespace std;
#define int long long
struct SegmentTree{
int st[400000];
void set(int id, int l, int r, int p, int val){
if(l == r) st[id] = val;
else{
int mid = (l + r) / 2;
if(p <= mid) set(id * 2, l, mid, p, val);
else set(id * 2 + 1, mid + 1, r, p, val);
st[id] = st[id * 2] + st[id * 2 + 1];
}
}
void update(int id, int l, int r, int u, int v, int k){
if(r < u || v < l || st[id] == 0) return;
if(l == r) st[id] /= k;
else{
int mid = (l + r) / 2;
update(id * 2, l, mid, u, v, k);
update(id * 2 + 1, mid + 1, r, u, v, k);
st[id] = st[id * 2] + st[id * 2 + 1];
}
}
int get(int id, int l, int r, int u, int v){
if(r < u || v < l) return 0;
if(u <= l && r <= v) return st[id];
int mid = (l + r) / 2;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
} tree;
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, q, k; cin >> n >> q >> k;
for(int i = 1; i <= n; i++){
int x; cin >> x;
tree.set(1, 1, n, i, x);
}
while(q--){
int a, b, c; cin >> a >> b >> c;
if(a == 1) tree.set(1, 1, n, b, c);
else if(a == 2 && k != 1) tree.update(1, 1, n, b, c, k);
else if(a == 3) cout << tree.get(1, 1, n, b, c) << "\n";
}
}