#include <bits/stdc++.h>
using namespace std;
int n = 0, q = 0;
struct Node {
  Node(int L, int R, int V) { l = L, r = R, v = V; }
  int l, r;
  int v;
};
inline bool operator<(const Node &A, const Node &B) {
  return A.l == B.l ? A.r < B.r : A.l < B.l;
}
set<Node> tr;
int cnt = 0;
set<Node>::iterator split(int cur) {
  set<Node>::iterator p = tr.lower_bound(Node(cur, cur, 0));
  if (p != tr.end() && p->l == cur) return p;
  --p;
  int l = p->l, r = p->r, v = p->v;
  tr.erase(p);
  tr.insert(Node(l, cur - 1, v));
  return tr.insert(Node(cur, r, v)).first;
}
void setWorkDay(int l, int r) {
  set<Node>::iterator rp = split(r + 1);
  set<Node>::iterator lp = split(l);
  int sum = 0;
  for (set<Node>::iterator p = lp; p != rp; ++p)
    if (p->v == 0) sum += p->r - p->l + 1;
  cnt += sum;
  tr.erase(lp, rp);
  tr.insert(Node(l, r, 1));
}
void setUnWorkDay(int l, int r) {
  set<Node>::iterator rp = split(r + 1);
  set<Node>::iterator lp = split(l);
  int sum = 0;
  for (set<Node>::iterator p = lp; p != rp; ++p)
    if (p->v == 1) sum += p->r - p->l + 1;
  cnt -= sum;
  tr.erase(lp, rp);
  tr.insert(Node(l, r, 0));
}
int main() {
  scanf("%d%d", &n, &q);
  tr.insert(Node(1, n, 1));
  cnt = n;
  int opt = 0, l = 0, r = 0;
  for (int i = 1; i <= q; ++i) {
    scanf("%d%d%d", &l, &r, &opt);
    if (opt == 1)
      setUnWorkDay(l, r);
    else
      setWorkDay(l, r);
    printf("%d\n", cnt);
  }
  return 0;
}
