#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 100005;
const int SQRT_N = 317; // Pierwiastek z 100 000
int ans[MAXN];
int diff[MAXN + SQRT_N]; // Tablica różnicowa dla małych d
struct Op {
int a, l;
};
vector<Op> small_ops[SQRT_N];
int main() {
// Szybkie wejście/wyjście
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, k;
if (!(cin >> n >> k)) return 0;
for (int i = 0; i < k; ++i) {
int a, l, d;
cin >> a >> l >> d;
if (d >= SQRT_N) {
// Dla dużych kroków wykonujemy operację bezpośrednio
for (int j = 0; j < l; ++j) {
ans[a + j * d]++;
}
} else {
// Dla małych kroków zapamiętujemy operację do późniejszego przetworzenia
small_ops[d].push_back({a, l});
}
}
// Przetwarzamy małe kroki grupami dla każdego d
for (int d = 1; d < SQRT_N; ++d) {
if (small_ops[d].empty()) continue;
// Czyścimy tablicę różnicową (tylko niezbędny zakres)
for (int i = 0; i <= n + d; ++i) diff[i] = 0;
for (auto &op : small_ops[d]) {
diff[op.a]++;
// Kończymy dodawanie po l elementach
int end_pos = op.a + op.l * d;
if (end_pos <= n + d) {
diff[end_pos]--;
}
}
// Obliczamy sumy prefiksowe z krokiem d
for (int i = 1; i <= n; ++i) {
if (i > d) diff[i] += diff[i - d];
ans[i] += diff[i];
}
}
// Wypisujemy wynik
for (int i = 1; i <= n; ++i) {
cout << ans[i] << (i == n ? "" : " ");
}
cout << endl;
return 0;
}