rt,救救蒟蒻吧(qwq
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for (int i = a; i <= b; i++)
const int N = 2e5 + 10, mod = 998244353;
int n, m;
struct Q {
int l, r, b, t, d, oper;
} q[N];
int ls[N], rs[N], x[N], y[N], l[N], r[N], b[N], t[N];
int w[N], cnt;
struct tag {
int a=1, b=0;
tag(int _a = 1, int _b = 0) {
a = _a;
b = _b;
}
int apply(int x) { return (a * x + b )%mod; }
tag comb(tag& y) { return tag(a * y.a % mod, (b * y.a + y.b)%mod ); }
bool emp() { return a == 1 && b == 0; }
};
tag I = tag(1, 0);
tag times(int x) { return tag(x, 0); }
tag adds(int x) { return tag(1, x); }
void gmx(int& x, int y) { x = max(x, y); }
void gmi(int& x, int y) { x = min(x, y); }
tag tg[N];
void apply(int x, tag T) {
w[x] = T.apply(w[x]);
tg[x] = tg[x].comb(T);
}
void pushdown(int x) {
if (tg[x].emp())
return;
if (ls[x])
apply(ls[x], tg[x]);
if (rs[x])
apply(rs[x], tg[x]);
tg[x] = I;
}
void pushup(int x) {
if (l > r)
return;
::l[x] = ::r[x] = ::x[x];
::b[x] = ::t[x] = ::y[x];
if (ls[x]) {
gmi(::l[x], ::l[ls[x]]);
gmx(::r[x], ::r[ls[x]]);
gmi(::b[x], ::b[ls[x]]);
gmx(::t[x], ::t[ls[x]]);
}
if (rs[x]) {
gmi(::l[x], ::l[rs[x]]);
gmx(::r[x], ::r[rs[x]]);
gmi(::b[x], ::b[rs[x]]);
gmx(::t[x], ::t[rs[x]]);
}
}
struct pt {
int x, y, id;
} P[N];
int ot;
int id[N];
bool operator<(pt a, pt b) {
if (ot) {
return a.x < b.x;
} else {
return a.y < b.y;
}
}
int top=0;
void build(int& x, int l, int r) {
if (l > r)
return;
x = ++cnt;
int mid = l + r >> 1;
ot = rand() % 2;
nth_element(P + l, P + mid, P + r + 1);
::x[x] = P[mid].x;
::y[x] = P[mid].y;
::id[x] = P[mid].id;
build(ls[x], l, mid - 1);
build(rs[x], mid + 1, r);
pushup(x);
}
void edit(int& x, int l, int r, int b, int t, tag T) {
if (l <= ::l[x] && ::r[x] <= r && b <= ::b[x] && ::t[x] <= t) {
apply(x, T);
return;
}
if (::l[x] > r || ::r[x] < l || ::b[x] > t || ::t[x] < b) {
return;
}
if (l <= ::x[x] && ::x[x] <= r && b <= ::y[x] && ::y[x] <= t) {
w[x] = T.apply(w[x]);
}
pushdown(x);
edit(ls[x], l, r, b, t, T);
edit(rs[x], l, r, b, t, T);
pushup(x);
}
int answ[N];
void print(int x) {
if (!x)
return;
pushdown(x);
print(ls[x]);
answ[id[x]] = ::w[x];
print(rs[x]);
}
int tot=0, lne[N];
int rt=0;
signed main() {
srand((unsigned)time(0));
ios::sync_with_stdio(0);
cin >> n >> m;
int op, l, r, d, p;
rep(i, 1, m) {
cin >> op;
if (op == 1) {
cin >> l >> r >> d;
q[++tot] = { l, r, i, N + 10, d, 0 };
lne[i] = tot;
} else if (op == 2) {
cin >> l >> r >> d;
q[++tot] = { l, r, i, N + 10, d, 1 };
lne[i] = tot;
} else if (op == 3) {
cin >> p;
P[++top] = { p, i, top };
} else {
cin >> p;
q[lne[p]].t = i;
}
}
build(rt, 1, top);
rep(i, 1, tot) {
if (q[i].oper == 0) {
edit(rt, q[i].l, q[i].r, q[i].b, q[i].t, adds(q[i].d%mod));
} else {
edit(rt, q[i].l, q[i].r, q[i].b, q[i].t, times(q[i].d%mod));
}
}
print(rt);
rep(i, 1, top) cout << answ[i] << '\n';
}