#include <bits/stdc++.h>
#include <unordered_map>
#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize ("O3")
#define int long long
using namespace std;
const int oo = 1e9 + 7;
const int MOD = 1e9 + 7;
const int MAXN = 1e6;
const int MAX = 2e5;
int dx[4] = { 0, 0, 1, -1 };
int dy[4] = { 1, -1, 0 ,0 };
struct Node {
int sum;
int min_val;
int min_pos;
} tree_node;
int n, q;
vector<int> a;
vector<Node> tree;
int offset = 0;
void build(int idx, int l, int r) {
if (l == r) {
tree[idx].sum = a[l];
tree[idx].min_val = a[l];
tree[idx].min_pos = l;
return;
}
int mid = (l + r) >> 1;
build(2 * idx, l, mid);
build(2 * idx + 1, mid + 1, r);
tree[idx].sum = tree[2 * idx].sum + tree[2 * idx + 1].sum;
if (tree[2 * idx].min_val <= tree[2 * idx + 1].min_val) {
tree[idx].min_val = tree[2 * idx].min_val;
tree[idx].min_pos = tree[2 * idx].min_pos;
}
else {
tree[idx].min_val = tree[2 * idx + 1].min_val;
tree[idx].min_pos = tree[2 * idx + 1].min_pos;
}
}
int get_sum(int idx, int l, int r, int u, int v) {
if (u > r || v < l) return 0;
if (l >= u && r <= v) return tree[idx].sum;
int mid = (l + r) >> 1;
return get_sum(2 * idx, l, mid, u, v) + get_sum(2 * idx + 1, mid + 1, r, u, v);
}
pair<int, int> get_min(int idx, int l, int r, int u, int v) {
if (u > r || v < l) return { oo, -1 };
if (l >= u && r <= v) return { tree[idx].min_val, tree[idx].min_pos };
int mid = (l + r) >> 1;
pair<int, int> left_min = get_min(2 * idx, l, mid, u, v);
pair<int, int> right_min = get_min(2 * idx + 1, mid + 1, r, u, v);
if (left_min.first < right_min.first) return left_min;
if (left_min.first > right_min.first) return right_min;
if (left_min.second < right_min.second) return left_min;
return right_min;
}
void point_update(int idx, int l, int r, int pos, int value) {
if (l == r) {
tree[idx].sum = value;
tree[idx].min_val = value;
tree[idx].min_pos = l;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) {
point_update(2 * idx, l, mid, pos, value);
}
else {
point_update(2 * idx + 1, mid + 1, r, pos, value);
}
tree[idx].sum = tree[2 * idx].sum + tree[2 * idx + 1].sum;
if (tree[2 * idx].min_val <= tree[2 * idx + 1].min_val) {
tree[idx].min_val = tree[2 * idx].min_val;
tree[idx].min_pos = tree[2 * idx].min_pos;
}
else {
tree[idx].min_val = tree[2 * idx + 1].min_val;
tree[idx].min_pos = tree[2 * idx + 1].min_pos;
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
a.resize(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
tree.resize(4 * n + 5);
build(1, 1, n);
while (q--) {
int type; cin >> type;
if (type == 1) {
int d; cin >> d;
offset = (offset + d) % n;
}
else if (type == 2) {
int s, t, p;
cin >> s >> t >> p;
int real_s = (s - offset - 1 + n * n) % n + 1;
int real_t = (t - offset - 1 + n * n) % n + 1;
if (real_s <= real_t) {
pair<int, int> min_info = get_min(1, 1, n, real_s, real_t);
point_update(1, 1, n, min_info.second, p);
}
else {
pair<int, int> min_info1 = get_min(1, 1, n, real_s, n);
pair<int, int> min_info2 = get_min(1, 1, n, 1, real_t);
pair<int, int> min_info;
if (min_info1.first < min_info2.first) {
min_info = min_info1;
}
else if (min_info1.first > min_info2.first) {
min_info = min_info2;
}
else {
if (s > t) {
min_info = min_info2;
}
else {
min_info = min_info1;
}
}
point_update(1, 1, n, min_info.second, p);
}
}
else if (type == 3) {
int s, t;
cin >> s >> t;
int real_s = (s - offset - 1 + n * n) % n + 1;
int real_t = (t - offset - 1 + n * n) % n + 1;
int ans = 0;
if (real_s <= real_t) {
ans = get_sum(1, 1, n, real_s, real_t);
}
else {
ans = get_sum(1, 1, n, real_s, n) + get_sum(1, 1, n, 1, real_t);
}
cout << ans << endl;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgojZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCiNwcmFnbWEgR0NDIG9wdGltaXplICgiTzMiKQojZGVmaW5lIGludCBsb25nIGxvbmcKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgb28gPSAxZTkgKyA3Owpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgaW50IE1BWE4gPSAxZTY7CmNvbnN0IGludCBNQVggPSAyZTU7CgppbnQgZHhbNF0gPSB7IDAsIDAsIDEsIC0xIH07CmludCBkeVs0XSA9IHsgMSwgLTEsIDAgLDAgfTsKc3RydWN0IE5vZGUgewogICAgaW50IHN1bTsKICAgIGludCBtaW5fdmFsOwogICAgaW50IG1pbl9wb3M7Cn0gdHJlZV9ub2RlOwoKaW50IG4sIHE7Cgp2ZWN0b3I8aW50PiBhOwoKdmVjdG9yPE5vZGU+IHRyZWU7CgppbnQgb2Zmc2V0ID0gMDsKCnZvaWQgYnVpbGQoaW50IGlkeCwgaW50IGwsIGludCByKSB7CiAgICBpZiAobCA9PSByKSB7CiAgICAgICAgdHJlZVtpZHhdLnN1bSA9IGFbbF07CiAgICAgICAgdHJlZVtpZHhdLm1pbl92YWwgPSBhW2xdOwogICAgICAgIHRyZWVbaWR4XS5taW5fcG9zID0gbDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgYnVpbGQoMiAqIGlkeCwgbCwgbWlkKTsKICAgIGJ1aWxkKDIgKiBpZHggKyAxLCBtaWQgKyAxLCByKTsKICAgIHRyZWVbaWR4XS5zdW0gPSB0cmVlWzIgKiBpZHhdLnN1bSArIHRyZWVbMiAqIGlkeCArIDFdLnN1bTsKCiAgICBpZiAodHJlZVsyICogaWR4XS5taW5fdmFsIDw9IHRyZWVbMiAqIGlkeCArIDFdLm1pbl92YWwpIHsKICAgICAgICB0cmVlW2lkeF0ubWluX3ZhbCA9IHRyZWVbMiAqIGlkeF0ubWluX3ZhbDsKICAgICAgICB0cmVlW2lkeF0ubWluX3BvcyA9IHRyZWVbMiAqIGlkeF0ubWluX3BvczsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHRyZWVbaWR4XS5taW5fdmFsID0gdHJlZVsyICogaWR4ICsgMV0ubWluX3ZhbDsKICAgICAgICB0cmVlW2lkeF0ubWluX3BvcyA9IHRyZWVbMiAqIGlkeCArIDFdLm1pbl9wb3M7CiAgICB9Cn0KCmludCBnZXRfc3VtKGludCBpZHgsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBpZiAodSA+IHIgfHwgdiA8IGwpIHJldHVybiAwOwogICAgaWYgKGwgPj0gdSAmJiByIDw9IHYpIHJldHVybiB0cmVlW2lkeF0uc3VtOwogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIHJldHVybiBnZXRfc3VtKDIgKiBpZHgsIGwsIG1pZCwgdSwgdikgKyBnZXRfc3VtKDIgKiBpZHggKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsKfQoKcGFpcjxpbnQsIGludD4gZ2V0X21pbihpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewogICAgaWYgKHUgPiByIHx8IHYgPCBsKSByZXR1cm4geyBvbywgLTEgfTsKICAgIGlmIChsID49IHUgJiYgciA8PSB2KSByZXR1cm4geyB0cmVlW2lkeF0ubWluX3ZhbCwgdHJlZVtpZHhdLm1pbl9wb3MgfTsKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICBwYWlyPGludCwgaW50PiBsZWZ0X21pbiA9IGdldF9taW4oMiAqIGlkeCwgbCwgbWlkLCB1LCB2KTsKICAgIHBhaXI8aW50LCBpbnQ+IHJpZ2h0X21pbiA9IGdldF9taW4oMiAqIGlkeCArIDEsIG1pZCArIDEsIHIsIHUsIHYpOwogICAgaWYgKGxlZnRfbWluLmZpcnN0IDwgcmlnaHRfbWluLmZpcnN0KSByZXR1cm4gbGVmdF9taW47CiAgICBpZiAobGVmdF9taW4uZmlyc3QgPiByaWdodF9taW4uZmlyc3QpIHJldHVybiByaWdodF9taW47CiAgICBpZiAobGVmdF9taW4uc2Vjb25kIDwgcmlnaHRfbWluLnNlY29uZCkgcmV0dXJuIGxlZnRfbWluOwogICAgcmV0dXJuIHJpZ2h0X21pbjsKfQoKdm9pZCBwb2ludF91cGRhdGUoaW50IGlkeCwgaW50IGwsIGludCByLCBpbnQgcG9zLCBpbnQgdmFsdWUpIHsKICAgIGlmIChsID09IHIpIHsKICAgICAgICB0cmVlW2lkeF0uc3VtID0gdmFsdWU7CiAgICAgICAgdHJlZVtpZHhdLm1pbl92YWwgPSB2YWx1ZTsKICAgICAgICB0cmVlW2lkeF0ubWluX3BvcyA9IGw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIGlmIChwb3MgPD0gbWlkKSB7CiAgICAgICAgcG9pbnRfdXBkYXRlKDIgKiBpZHgsIGwsIG1pZCwgcG9zLCB2YWx1ZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwb2ludF91cGRhdGUoMiAqIGlkeCArIDEsIG1pZCArIDEsIHIsIHBvcywgdmFsdWUpOwogICAgfQogICAgdHJlZVtpZHhdLnN1bSA9IHRyZWVbMiAqIGlkeF0uc3VtICsgdHJlZVsyICogaWR4ICsgMV0uc3VtOwogICAgaWYgKHRyZWVbMiAqIGlkeF0ubWluX3ZhbCA8PSB0cmVlWzIgKiBpZHggKyAxXS5taW5fdmFsKSB7CiAgICAgICAgdHJlZVtpZHhdLm1pbl92YWwgPSB0cmVlWzIgKiBpZHhdLm1pbl92YWw7CiAgICAgICAgdHJlZVtpZHhdLm1pbl9wb3MgPSB0cmVlWzIgKiBpZHhdLm1pbl9wb3M7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0cmVlW2lkeF0ubWluX3ZhbCA9IHRyZWVbMiAqIGlkeCArIDFdLm1pbl92YWw7CiAgICAgICAgdHJlZVtpZHhdLm1pbl9wb3MgPSB0cmVlWzIgKiBpZHggKyAxXS5taW5fcG9zOwogICAgfQp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCk7CgogICAgY2luID4+IG4gPj4gcTsKICAgIGEucmVzaXplKG4gKyAxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgfQogICAgdHJlZS5yZXNpemUoNCAqIG4gKyA1KTsKICAgIGJ1aWxkKDEsIDEsIG4pOwoKICAgIHdoaWxlIChxLS0pIHsKICAgICAgICBpbnQgdHlwZTsgY2luID4+IHR5cGU7CiAgICAgICAgaWYgKHR5cGUgPT0gMSkgewogICAgICAgICAgICBpbnQgZDsgY2luID4+IGQ7CiAgICAgICAgICAgIG9mZnNldCA9IChvZmZzZXQgKyBkKSAlIG47CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gMikgewogICAgICAgICAgICBpbnQgcywgdCwgcDsKICAgICAgICAgICAgY2luID4+IHMgPj4gdCA+PiBwOwogICAgICAgICAgICBpbnQgcmVhbF9zID0gKHMgLSBvZmZzZXQgLSAxICsgbiAqIG4pICUgbiArIDE7CiAgICAgICAgICAgIGludCByZWFsX3QgPSAodCAtIG9mZnNldCAtIDEgKyBuICogbikgJSBuICsgMTsKCiAgICAgICAgICAgIGlmIChyZWFsX3MgPD0gcmVhbF90KSB7CiAgICAgICAgICAgICAgICBwYWlyPGludCwgaW50PiBtaW5faW5mbyA9IGdldF9taW4oMSwgMSwgbiwgcmVhbF9zLCByZWFsX3QpOwogICAgICAgICAgICAgICAgcG9pbnRfdXBkYXRlKDEsIDEsIG4sIG1pbl9pbmZvLnNlY29uZCwgcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwYWlyPGludCwgaW50PiBtaW5faW5mbzEgPSBnZXRfbWluKDEsIDEsIG4sIHJlYWxfcywgbik7CiAgICAgICAgICAgICAgICBwYWlyPGludCwgaW50PiBtaW5faW5mbzIgPSBnZXRfbWluKDEsIDEsIG4sIDEsIHJlYWxfdCk7CiAgICAgICAgICAgICAgICBwYWlyPGludCwgaW50PiBtaW5faW5mbzsKICAgICAgICAgICAgICAgIGlmIChtaW5faW5mbzEuZmlyc3QgPCBtaW5faW5mbzIuZmlyc3QpIHsKICAgICAgICAgICAgICAgICAgICBtaW5faW5mbyA9IG1pbl9pbmZvMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbl9pbmZvMS5maXJzdCA+IG1pbl9pbmZvMi5maXJzdCkgewogICAgICAgICAgICAgICAgICAgIG1pbl9pbmZvID0gbWluX2luZm8yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHMgPiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9pbmZvID0gbWluX2luZm8yOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluX2luZm8gPSBtaW5faW5mbzE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9pbnRfdXBkYXRlKDEsIDEsIG4sIG1pbl9pbmZvLnNlY29uZCwgcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAzKSB7CiAgICAgICAgICAgIGludCBzLCB0OwogICAgICAgICAgICBjaW4gPj4gcyA+PiB0OwoKICAgICAgICAgICAgaW50IHJlYWxfcyA9IChzIC0gb2Zmc2V0IC0gMSArIG4gKiBuKSAlIG4gKyAxOwogICAgICAgICAgICBpbnQgcmVhbF90ID0gKHQgLSBvZmZzZXQgLSAxICsgbiAqIG4pICUgbiArIDE7CgogICAgICAgICAgICBpbnQgYW5zID0gMDsKICAgICAgICAgICAgaWYgKHJlYWxfcyA8PSByZWFsX3QpIHsKICAgICAgICAgICAgICAgIGFucyA9IGdldF9zdW0oMSwgMSwgbiwgcmVhbF9zLCByZWFsX3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYW5zID0gZ2V0X3N1bSgxLCAxLCBuLCByZWFsX3MsIG4pICsgZ2V0X3N1bSgxLCAxLCBuLCAxLCByZWFsX3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdXQgPDwgYW5zIDw8IGVuZGw7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0K