#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int n, m, att[100002], sol[12];
struct arr {
  int l, c, pi;
};
arr v[100002];
bool cmp1(arr a, arr b) {
  if (a.l == b.l) return a.c < b.c;
  return a.l < b.l;
}
bool cmp2(arr a, arr b) {
  if (a.c == b.c) return a.l < b.l;
  return a.c < b.c;
}
bool cmp3(arr a, arr b) {
  if (a.l - a.c == b.l - b.c) return a.l < b.l;
  return (a.l - a.c) < (b.l - b.c);
}
int org(int L, int C) {
  int diff = min(L - 1, n - C);
  int xx = L - diff;
  int yy = C + diff;
  if (xx == 1) return yy;
  return n + xx - 1;
}
bool cmp4(arr a, arr b) {
  int x = org(a.l, a.c);
  int y = org(b.l, b.c);
  if (x != y) return x < y;
  return a.l < b.l;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) cin >> v[i].l >> v[i].c, v[i].pi = i;
  sort(v + 1, v + m + 1, cmp1);
  for (int i = 1; i <= m; ++i) {
    if (v[i - 1].l == v[i].l) ++att[v[i].pi];
    if (v[i + 1].l == v[i].l) ++att[v[i].pi];
  }
  sort(v + 1, v + m + 1, cmp2);
  for (int i = 1; i <= m; ++i) {
    if (v[i - 1].c == v[i].c) ++att[v[i].pi];
    if (v[i + 1].c == v[i].c) ++att[v[i].pi];
  }
  sort(v + 1, v + m + 1, cmp3);
  for (int i = 1; i <= m; ++i) {
    int a = v[i].l - v[i].c;
    int b = v[i - 1].l - v[i - 1].c;
    int c = v[i + 1].l - v[i + 1].c;
    if (i > 1 && a == b) ++att[v[i].pi];
    if (i < m && a == c) ++att[v[i].pi];
  }
  sort(v + 1, v + m + 1, cmp4);
  for (int i = 1; i <= m; ++i) {
    if (i && org(v[i - 1].l, v[i - 1].c) == org(v[i].l, v[i].c)) ++att[v[i].pi];
    if (i < m && org(v[i + 1].l, v[i + 1].c) == org(v[i].l, v[i].c))
      ++att[v[i].pi];
  }
  for (int i = 1; i <= m; ++i) sol[att[i]]++;
  for (int i = 0; i <= 8; ++i) cout << sol[i] << " ";
  return 0;
}
