#include #include using namespace std; typedef long long LL; const LL V = 1e13; const int N = 150010; int q; LL n, ans[6]; struct Node { int l, r, lz; LL sum[6]; }; struct SegTree { Node seg[N * 25]; int rt, idx; void PushUp(int u) { for (int i = 1; i <= 5; ++i) { seg[u].sum[i] = seg[seg[u].l].sum[i] + seg[seg[u].r].sum[i]; } } void PushDown(int u, LL ul, LL ur) { if (seg[u].lz) { if (!seg[u].l) seg[u].l = ++idx; if (!seg[u].r) seg[u].r = ++idx; int mid = ul + ur >> 1; seg[seg[u].l].lz = seg[seg[u].r].lz = seg[u].lz; for (int i = 1; i <= 5; ++i) { if (seg[u].lz == i) { seg[seg[u].l].sum[i] = mid - ul + 1; seg[seg[u].r].sum[i] = ur - mid; } else { seg[seg[u].l].sum[i] = 0; seg[seg[u].r].sum[i] = 0; } } seg[u].lz = 0; } } void Modify(int &u, LL ul, LL ur, int l, int r, int id) { if (!u) u = ++idx; if (l <= ul && ur <= r) { seg[u].lz = id; for (int i = 1; i <= 5; ++i) { if (i == id) seg[u].sum[i] += ur - ul + 1; else seg[u].sum[i] = 0; } return; } PushDown(u, ul, ur); LL mid = ul + ur >> 1; if (mid >= l) Modify(seg[u].l, ul, mid, l, r, id); if (mid + 1 <= r) Modify(seg[u].r, mid + 1, ur, l, r, id); PushUp(u); } Node Query(int u, LL ul, LL ur, int l, int r) { if (l <= ul && ur <= r) return seg[u]; PushDown(u, ul, ur); Node ret = { 0, 0, 0 }; LL mid = ul + ur >> 1; if (mid >= l) { Node res = Query(seg[u].l, ul, mid, l, r); for (int i = 1; i <= 5; ++i) ret.sum[i] += res.sum[i]; } if (mid + 1 <= r) { Node res = Query(seg[u].r, mid + 1, ur, l, r); for (int i = 1; i <= 5; ++i) ret.sum[i] += res.sum[i]; } return ret; } }; SegTree sgt; int main() { // freopen("color.in", "r", stdin); // freopen("color.out", "w", stdout); scanf("%lld%d", &n, &q); while (q--) { int op, l, r; scanf("%d%d%d", &op, &l, &r); if (op == 0) { Node res = sgt.Query(sgt.rt, 0, V, l, r); // 最大值,多少个最大值 int ma = 0, ma_idx; for (int i = 1; i <= 5; ++i) { if (ma < res.sum[i]) { ma = res.sum[i]; ma_idx = i; } else if (ma == res.sum[i]) { ma_idx = -1; } } if (ma > 0 && ma_idx != -1) { ans[ma_idx] += ma; } } else if (op == 1) { sgt.Modify(sgt.rt, 0, V, l, r, 1); } else if (op == 2) { sgt.Modify(sgt.rt, 0, V, l, r, 2); } else if (op == 3) { sgt.Modify(sgt.rt, 0, V, l, r, 3); } else if (op == 4) { sgt.Modify(sgt.rt, 0, V, l, r, 4); } else { sgt.Modify(sgt.rt, 0, V, l, r, 5); } } for (int i = 1; i <= 5; ++i) { printf("%lld%c", ans[i] + sgt.seg[1].sum[i], " \n"[i == 5]); } return 0; }