#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 3;
int t[10] = {0};
struct da {
  int x;
  int y;
  int b;
  int c;
  int n;
};
da data[N];
bool xmax(const da &a, const da &b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
bool ymax(const da &a, const da &b) {
  if (a.y != b.y) return a.y < b.y;
  return a.x < b.x;
}
bool bxmax(const da &a, const da &b) {
  if (a.b != b.b) return a.b < b.b;
  return a.x < b.x;
}
bool cxmax(const da &a, const da &b) {
  if (a.c != b.c) return a.c < b.c;
  return a.x < b.x;
}
int main() {
  int i, j, k, n, m;
  while (scanf("%d%d", &n, &m) != EOF) {
    memset(data, 0, sizeof(data));
    memset(t, 0, sizeof(t));
    for (i = 0; i < m; i++) {
      scanf("%d%d", &data[i].x, &data[i].y);
      data[i].b = data[i].y - data[i].x;
      data[i].c = data[i].x + data[i].y;
    }
    sort(data, data + m, xmax);
    for (i = 0; i < m; i++) {
      j = i + 1;
      while (data[i].x == data[j].x && j < m) j++;
      for (k = i; k < j; k++) data[k].n += 2;
      data[i].n--;
      data[j - 1].n--;
      i = j - 1;
    }
    sort(data, data + m, ymax);
    for (i = 0; i < m; i++) {
      j = i + 1;
      while (data[i].y == data[j].y && j < m) j++;
      for (k = i; k < j; k++) data[k].n += 2;
      data[i].n--;
      data[j - 1].n--;
      i = j - 1;
    }
    sort(data, data + m, bxmax);
    for (i = 0; i < m; i++) {
      j = i + 1;
      while (data[i].b == data[j].b && j < m) j++;
      for (k = i; k < j; k++) data[k].n += 2;
      data[i].n--;
      data[j - 1].n--;
      i = j - 1;
    }
    sort(data, data + m, cxmax);
    for (i = 0; i < m; i++) {
      j = i + 1;
      while (data[i].c == data[j].c && j < m) j++;
      for (k = i; k < j; k++) data[k].n += 2;
      data[i].n--;
      data[j - 1].n--;
      i = j - 1;
    }
    for (i = 0; i < m; i++) t[data[i].n]++;
    for (i = 0; i < 8; i++) printf("%d ", t[i]);
    printf("%d\n", t[i]);
  }
}
