#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
vector<long long> segt;
void build(int i, int l, int r, vector<long long>& v){
if(l == r){
segt[i] = v[l];
}else{
int mid = (l+r)/2;
build(i*2, l ,mid, v);
build(i*2+1, mid+1, r, v);
segt[i] = segt[i*2]+segt[i*2+1];
}
}
void seti(int i, int l, int r, int pos, int val){
if(l == r){
segt[i] = val;
}else{
int mid = (l+r)/2;
if(pos <= mid){
seti(i*2, l, mid, pos, val);
}else{
seti(i*2+1, mid+1, r, pos, val);
}
segt[i] = segt[i*2] + segt[i*2+1];
}
}
long long sumi(int i, int l, int r, int lb, int rb){
if(r < lb || l > rb){
return 0;
}else if(l >= lb && r <= rb){
return segt[i];
}else{
int mid = (l+r)/2;
return sumi(i*2, l, mid, lb, rb) + sumi(i*2+1, mid+1, r, lb, rb);
}
}
int main()
{
fio
int n, q, k;
cin >> n >> q >> k;
vector<long long> v(n);
for(int i = 0; i < n; ++i){
cin >> v[i];
}
segt.resize(4*n, 0);
build(1, 0, n-1, v);
if(k == 1){
for(int i = 0; i < q; ++i){
int op;
cin >> op;
if(op == 1){
int a, b;
cin >> a >> b;
--a;
seti(1, 0, n-1, a, b);
}else if(op == 2){
int l, r;
cin >> l >> r;
}else if(op == 3){
int l, r;
cin >> l >> r;
--l;
--r;
cout << sumi(1, 0, n-1, l, r) << '\n';
}
}
}else{
set<int> s;
for(int i = 0; i < n; ++i){
if(v[i] > 0){
s.insert(i);
}
}
for(int i = 0; i < q; ++i){
int op;
cin >> op;
if(op == 1){
int a, b;
cin >> a >> b;
--a;
v[a] == b;
seti(1, 0, n-1, a, b);
}else if(op == 2){
int l, r;
cin >> l >> r;
--l;
--r;
auto it = s.lower_bound(l);
while(it != s.end() && *it <= r){
seti(1, 0, n-1, *it, v[*it]/k);
v[*it] = v[*it]/k;
if(v[*it] == 0){
s.erase(it);
}
l = (*it)+1;
it = s.lower_bound(l);
}
}else if(op == 3){
int l, r;
cin >> l >> r;
--l;
--r;
cout << sumi(1, 0, n-1, l, r) << '\n';
}
}
}
return 0;
}