#include <bits/stdc++.h>
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define FOD(i, a, b) for(int i = (a); i >= (b); i--)
#define file(name) if(fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define el cout << '\n'
#define maxn int(1e5 + 5)
using namespace std;
typedef long long ll;
int n, q, k, mx[maxn << 2];
ll t[maxn << 2];
void update(int pos, int val, int id = 1, int l = 1, int r = n) {
if(pos < l || r < pos) return;
if(l == r) {
t[id] = mx[id] = val;
return;
}
int mid = (l + r) >> 1;
update(pos, val, id << 1, l, mid);
update(pos, val, id << 1 | 1, mid + 1, r);
t[id] = t[id << 1] + t[id << 1 | 1];
mx[id] = max(mx[id << 1], mx[id << 1 | 1]);
}
void divs(int u, int v, int id = 1, int l = 1, int r = n) {
if(v < l || r < u) return;
if(u <= l && r <= v) {
if(mx[id] < k) {
t[id] = mx[id] = 0;
return;
}
}
if(l == r) {
mx[id] /= k;
t[id] /= k;
return;
}
int mid = (l + r) >> 1;
divs(u, v, id << 1, l, mid);
divs(u, v, id << 1 | 1, mid + 1, r);
t[id] = t[id << 1] + t[id << 1 | 1];
mx[id] = max(mx[id << 1], mx[id << 1 | 1]);
}
ll get(int u, int v, int id = 1, int l = 1, int r = n) {
if(v < l || r < u) return 0;
if(u <= l && r <= v) return t[id];
int mid = (l + r) >> 1;
return get(u, v, id << 1, l, mid) + get(u, v, id << 1 | 1, mid + 1, r);
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> q >> k;
FOR(i, 1, n) {
int x;
cin >> x;
update(i, x);
}
while(q--) {
int type, u, v;
cin >> type >> u >> v;
if(type == 1) update(u, v);
else if(type == 2) {
if(k != 1) divs(u, v);
}
else cout << get(u, v), el;
}
return 0;
}