#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream& operator<<(ostream& fout, const vector<T>& vec) {
  for (const auto& el : vec) {
    fout << el << ' ';
  }
  return fout;
}
template <class T>
istream& operator>>(istream& fin, vector<T>& vec) {
  for (size_t i = 0; i < vec.size(); ++i) {
    cin >> vec[i];
  }
  return fin;
}
vector<int> res;
vector<int> an;
vector<int> bn;
bool dfs(int k = 0, int skip_check = 0, int mask = 0) { return 0; }
set<pair<int, int>> removed;
int n, q;
int lft;
void add(int l, int r, int k) {
  vector<pair<int, int>> to_remove;
  vector<pair<int, int>> to_add;
  if (k == 1) to_add.push_back({r, l});
  auto pos = removed.upper_bound({r, l});
  while (true) {
    if (pos == removed.end()) {
      if (pos == removed.begin()) break;
      std::advance(pos, -1);
      continue;
    }
    if (pos->second >= r) {
      if (pos == removed.begin()) break;
      std::advance(pos, -1);
      continue;
    }
    if (pos->first <= l) break;
    to_remove.push_back(*pos);
    if (pos->second < l) {
      to_add.push_back({l, pos->second});
    }
    if (pos->first > r) {
      to_add.push_back({pos->first, r});
    }
    if (pos == removed.begin()) break;
    std::advance(pos, -1);
  }
  for (auto el : to_remove) {
    lft += el.first - el.second;
    removed.erase(el);
  }
  for (auto el : to_add) {
    lft -= el.first - el.second;
    removed.insert(el);
  }
}
int Solve() {
  cin >> n >> q;
  lft = n;
  while (q--) {
    int l, r, k;
    cin >> l >> r >> k;
    switch (k) {
      case 1:
        add(l, r + 1, k);
        break;
      case 2:
        add(l, r + 1, k);
        break;
    }
    std::cout << lft << '\n';
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  Solve();
  return 0;
}
