#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e5 + 10;
LL n, m, a[N];
LL read() {
register LL x = 0, f = 1; register char ch;
ch = getchar();
while(ch > '9' || ch < '0'){if(ch == '-') f = -f; ch = getchar();}
while(ch <= '9' && ch >= '0'){x = x * 10 + ch - 48; ch = getchar();}
return x * f;
}
struct Node{
LL l, r;
LL sum, maxx;
}tr[4 * N];
void pushup(LL u) {
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
tr[u].maxx = max(tr[u << 1].maxx, tr[u << 1 | 1].maxx);
}
void build(LL u, LL l, LL r) {
if(l == r) tr[u] = {l, r, a[l], a[l]};
else {
tr[u] = {l, r};
LL mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(LL u, LL k, LL x) {
if(tr[u].l == k && tr[u].r == k) tr[u].sum = tr[u].maxx = x;
else {
LL mid = tr[u].l + tr[u].r >> 1;
if(k <= mid) modify(u << 1, k, x);
else modify(u << 1 | 1, k, x);
pushup(u);
}
}
void Mod(LL u, LL l, LL r, LL x) {
if(tr[u].l >= l && tr[u].r <= r && tr[u].maxx < x) {
return;
}
if(tr[u].l >= l && tr[u].r <= r && tr[u].l == tr[u].r) {
tr[u].maxx %= x;
tr[u].sum %= x;
return;
}
LL mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) Mod(u << 1, l, r, x);
if(r > mid) Mod(u << 1 | 1, l, r, x);
pushup(u);
}
LL query(LL u, LL l, LL r) {
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
else {
LL mid = tr[u].l + tr[u].r >> 1;
LL sum = 0;
if(l <= mid) sum = query(u << 1, l, r);
if(r > mid) sum += query(u << 1 | 1, l, r);
return sum;
}
}
int main() {
n = read(); m = read();
for(LL i = 1; i <= n; i++) a[i] = read();
build(1, 1, n);
while(m--) {
LL op;
op = read();
if(op == 1) {
LL l, r;
l = read(); r = read();
printf("%d\n", query(1, l, r));
} else if(op == 2) {
LL l, r, x;
l = read(); r = read(); x = read();
Mod(1, l, r, x);
} else {
LL k, x;
k = read(); x = read();
modify(1, k, x);
}
}
return 0;
}
评测记录