#include using namespace std; typedef long long ll; const int MAX = 300005; const ll MOD = 1000000000000000009LL; ll a[MAX], op[3][150005]; ll len[4 * MAX], s[5][4 * MAX], ans[5]; int cov[4 * MAX]; int n, q, m; int bnd(ll *arr, int n, ll val) { int l = 0, r = n - 1, res = n; while (l <= r) { int mid = (l + r) / 2; if (arr[mid] >= val) { res = mid; r = mid - 1; } else { l = mid + 1; } } return res; } void pdn(int u) { if (cov[u] != -1) { int c = cov[u]; cov[u * 2] = cov[u * 2 + 1] = c; for (int i = 0; i < 5; i++) s[i][u * 2] = s[i][u * 2 + 1] = 0; s[c][u * 2] = len[u * 2]; s[c][u * 2 + 1] = len[u * 2 + 1]; } } void upd(int u, int l, int r, int L, int R, int c) { if (L <= l && r <= R) { if (cov[u] == c) { s[c][u] += len[u]; } else if (cov[u] != -1) { s[cov[u]][u] -= len[u]; s[c][u] += len[u]; cov[u] = c; } else { pdn(u); int mid = (l + r) / 2; upd(u * 2, l, mid, L, R, c); upd(u * 2 + 1, mid + 1, r, L, R, c); for (int i = 0; i < 5; i++) s[i][u] = s[i][u * 2] + s[i][u * 2 + 1]; if (cov[u * 2] == cov[u * 2 + 1]) cov[u] = cov[u * 2]; else cov[u] = -1; } return; } pdn(u); int mid = (l + r) / 2; if (L <= mid) upd(u * 2, l, mid, L, R, c); if (R > mid) upd(u * 2 + 1, mid + 1, r, L, R, c); for (int i = 0; i < 5; i++) s[i][u] = s[i][u * 2] + s[i][u * 2 + 1]; if (cov[u * 2] == cov[u * 2 + 1]) cov[u] = cov[u * 2]; else cov[u] = -1; } void qry(int u, int l, int r, int L, int R, ll *res) { if (L <= l && r <= R) { for (int i = 0; i < 5; i++) res[i] += s[i][u]; return; } pdn(u); int mid = (l + r) / 2; if (L <= mid) qry(u * 2, l, mid, L, R, res); if (R > mid) qry(u * 2 + 1, mid + 1, r, L, R, res); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> q; int cnt = 0; a[cnt++] = 0; a[cnt++] = n; for (int i = 0; i < q; i++) { cin >> op[0][i] >> op[1][i] >> op[2][i]; a[cnt++] = op[1][i]; a[cnt++] = op[2][i] + 1; } sort(a, a + cnt); m = 1; for (int i = 1; i < cnt; i++) { if (a[i] != a[i - 1]) a[m++] = a[i]; } for (int i = 1; i < m; i++) { len[i] = a[i] - a[i - 1]; } memset(cov, -1, sizeof(cov)); for (int i = 0; i < q; i++) { int x = op[0][i]; ll l = op[1][i], r = op[2][i]; int L = bnd(a, m, l) + 1; int R = bnd(a, m, r + 1); if (x == 0) { ll res[5] = {0}; qry(1, 1, m - 1, L, R, res); ll mx = -1; int cnt_mx = 0; for (int j = 0; j < 5; j++) { if (res[j] > mx) { mx = res[j]; cnt_mx = 1; } else if (res[j] == mx) { cnt_mx++; } } if (cnt_mx == 1) { for (int j = 0; j < 5; j++) { if (res[j] == mx) { ans[j] = (ans[j] + mx) % MOD; break; } } } } else { upd(1, 1, m - 1, L, R, x - 1); } } cout << ans[0] << " " << ans[1] << " " << ans[2] << " " << ans[3] << " " << ans[4] << "\n"; return 0; }