#include <bits/stdc++.h>
using namespace std;
struct Q {
  int r, c, id;
} q[100001];
int m, n;
bool cmph(Q a, Q b) {
  if (a.r != b.r) return a.r < b.r;
  return a.c < b.c;
}
bool cmps(Q a, Q b) {
  if (a.c != b.c) return a.c < b.c;
  return a.r < b.r;
}
bool cmpp(Q a, Q b) {
  if (a.r + a.c != b.r + b.c) return a.r + a.c < b.r + b.c;
  return a.r < b.r;
}
bool cmpn(Q a, Q b) {
  if (a.r - a.c != b.r - b.c) return a.r - a.c < b.r - b.c;
  return a.r < b.r;
}
int cnt[100001];
int main(int argc, char *argv[]) {
  scanf("%d%d", &m, &n);
  do {
    memset(cnt, 0, sizeof(cnt));
  } while (0);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &(q[i].r), &(q[i].c));
    q[i].id = i;
  }
  sort(q, q + n, cmph);
  for (int i = 1; i < n; i++) {
    if (q[i - 1].r == q[i].r) {
      cnt[q[i - 1].id]++;
      cnt[q[i].id]++;
    }
  }
  sort(q, q + n, cmps);
  for (int i = 1; i < n; i++) {
    if (q[i - 1].c == q[i].c) {
      cnt[q[i - 1].id]++;
      cnt[q[i].id]++;
    }
  }
  sort(q, q + n, cmpp);
  for (int i = 1; i < n; i++) {
    if (q[i - 1].r + q[i - 1].c == q[i].r + q[i].c) {
      cnt[q[i - 1].id]++;
      cnt[q[i].id]++;
    }
  }
  sort(q, q + n, cmpn);
  for (int i = 1; i < n; i++) {
    if (q[i - 1].r - q[i - 1].c == q[i].r - q[i].c) {
      cnt[q[i - 1].id]++;
      cnt[q[i].id]++;
    }
  }
  int cc[9];
  do {
    memset(cc, 0, sizeof(cc));
  } while (0);
  for (int i = 0; i < n; i++) cc[cnt[i]]++;
  for (int i = 0; i < 9; i++) {
    printf("%d ", cc[i]);
  }
  return EXIT_SUCCESS;
}
