#include <bits/stdc++.h>
using namespace std;
const int maxn = 600005, inf = 0x3f3f3f3f;
struct Qs {
  int l, r, k, id;
  void read(vector<int> &v) {
    scanf("%d %d %d", &l, &r, &k);
    v.push_back(l);
    v.push_back(r + 1);
  }
} qs[maxn];
vector<int> ls;
struct SegT {
  int a[maxn << 2], tag[maxn << 2];
  void pushup(int rt) { a[rt] = a[rt << 1] + a[rt << 1 | 1]; }
  void pushdown(int l, int r, int rt) {
    if (tag[rt] == 2) {
      int mid = l + r >> 1;
      tag[rt << 1] = tag[rt << 1 | 1] = 2;
      a[rt << 1] = ls[mid + 1] - ls[l];
      a[rt << 1 | 1] = ls[r + 1] - ls[mid + 1];
      tag[rt] = 0;
    } else if (tag[rt] == 1) {
      int mid = l + r >> 1;
      tag[rt << 1] = tag[rt << 1 | 1] = 1;
      a[rt << 1] = 0;
      a[rt << 1 | 1] = 0;
      tag[rt] = 0;
    }
  }
  void update(int L, int R, int k, int l, int r, int rt) {
    if (L <= l && R >= r) {
      tag[rt] = k;
      a[rt] = (k == 2 ? ls[r + 1] - ls[l] : 0);
      return;
    }
    int mid = l + r >> 1;
    pushdown(l, r, rt);
    if (L <= mid) update(L, R, k, l, mid, rt << 1);
    if (R > mid) update(L, R, k, mid + 1, r, rt << 1 | 1);
    pushup(rt);
  }
  int ask(int L, int R, int l, int r, int rt) {
    if (L <= l && R >= r) {
      return a[rt];
    }
    int mid = l + r >> 1, ans = 0;
    pushdown(l, r, rt);
    if (L <= mid) ans += ask(L, R, l, mid, rt << 1);
    if (R > mid) ans += ask(L, R, mid + 1, r, rt << 1 | 1);
    return ans;
  }
} t;
int getPos(int x) { return lower_bound(ls.begin(), ls.end(), x) - ls.begin(); }
int n, q;
int main() {
  scanf("%d %d", &n, &q);
  ls.push_back(n + 1);
  ls.push_back(1);
  for (int i = 0; i < (q); ++i) {
    qs[i].read(ls);
  }
  sort(ls.begin(), ls.end());
  ls.erase(unique(ls.begin(), ls.end()), ls.end());
  int p1 = getPos(1), p2 = getPos(n + 1) - 1;
  n = (int)ls.size();
  t.update(p1, p2, 2, 0, n, 1);
  for (int i = 0; i < (q); ++i) {
    int l = qs[i].l, r = qs[i].r, k = qs[i].k;
    t.update(getPos(l), getPos(r + 1) - 1, k, 0, n, 1);
    printf("%d\n", t.ask(p1, p2, 0, n, 1));
  }
}
