#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
int nL[13500000];
int nR[13500000];
int val[13500000];
bool nodeNull[13500000];
int currFree = 0;
void createNode() {
  nL[currFree] = -1;
  nR[currFree] = -1;
  currFree++;
}
int change(int t, int l, int r, int lx, int rx, int x) {
  if (l == lx && r == rx) {
    if (x == 0) {
      if (t != -1 && !nodeNull[t]) {
        if (nL[t] != -1) nodeNull[nL[t]] = true;
        if (nR[t] != -1) nodeNull[nR[t]] = true;
        val[t] = 0;
      }
    } else {
      if (t == -1) {
        t = currFree;
        createNode();
      } else if (nodeNull[t])
        nodeNull[t] = false;
      if (nL[t] != -1) nodeNull[nL[t]] = true;
      if (nR[t] != -1) nodeNull[nR[t]] = true;
      val[t] = r - l + 1;
    }
  } else {
    if (x == 1) {
      if (t == -1) {
        t = currFree;
        createNode();
      } else if (nodeNull[t]) {
        nodeNull[t] = false;
        if (nL[t] != -1) nodeNull[nL[t]] = true;
        if (nR[t] != -1) nodeNull[nR[t]] = true;
        val[t] = 0;
      }
    } else if (x == 0 && (t == -1 || nodeNull[t]))
      return t;
    int mid = (l + r) >> 1;
    if (val[t] == r - l + 1) {
      nL[t] = change(nL[t], l, mid, l, mid, 1);
      nR[t] = change(nR[t], mid + 1, r, mid + 1, r, 1);
    }
    if (lx <= mid) nL[t] = change(nL[t], l, mid, lx, min(rx, mid), x);
    if (rx > mid) nR[t] = change(nR[t], mid + 1, r, max(lx, mid + 1), rx, x);
    val[t] = 0;
    if (nL[t] != -1 && !nodeNull[nL[t]]) val[t] = val[nL[t]];
    if (nR[t] != -1 && !nodeNull[nR[t]]) val[t] += val[nR[t]];
  }
  return t;
}
int main() {
  int n, q, type, l, r;
  scanf("%d%d", &n, &q);
  int tree = -1;
  for (int i = 0; i < q; i++) {
    scanf("%d%d%d", &l, &r, &type);
    l--;
    r--;
    if (type == 1)
      tree = change(tree, 0, n - 1, l, r, 1);
    else
      tree = change(tree, 0, n - 1, l, r, 0);
    int res = n - (tree == -1 ? 0 : val[tree]);
    printf("%d\n", res);
  }
}
