#include <bits/stdc++.h>
using namespace std;
int n, m, r, c;
int counter[100000];
bool ROW(pair<int, pair<int, int> > x, pair<int, pair<int, int> > y) {
  if (x.second.first < y.second.first) return true;
  if (x.second.first > y.second.first) return false;
  if (x.second.second < y.second.second) return true;
  if (x.second.second > y.second.second) return false;
}
bool COLUMN(pair<int, pair<int, int> > x, pair<int, pair<int, int> > y) {
  if (x.second.second < y.second.second) return true;
  if (x.second.second > y.second.second) return false;
  if (x.second.first < y.second.first) return true;
  if (x.second.first > y.second.first) return false;
}
bool DIAG(pair<int, pair<int, int> > x, pair<int, pair<int, int> > y) {
  if (x.second.first - x.second.second < y.second.first - y.second.second)
    return true;
  if (x.second.first - x.second.second > y.second.first - y.second.second)
    return false;
  if (x.second.first + x.second.second < y.second.first + y.second.second)
    return true;
  if (x.second.first + x.second.second > y.second.first + y.second.second)
    return false;
}
bool ANTI(pair<int, pair<int, int> > x, pair<int, pair<int, int> > y) {
  if (x.second.first + x.second.second < y.second.first + y.second.second)
    return true;
  if (x.second.first + x.second.second > y.second.first + y.second.second)
    return false;
  if (x.second.first - x.second.second < y.second.first - y.second.second)
    return true;
  if (x.second.first - x.second.second > y.second.first - y.second.second)
    return false;
}
int main() {
  scanf("%d%d", &n, &m);
  vector<pair<int, pair<int, int> > > v(m);
  for (int i = 0; i < m; i++) {
    v[i].first = i;
    scanf("%d%d", &v[i].second.first, &v[i].second.second);
  }
  sort(v.begin(), v.end(), ROW);
  if (v[0].second.first == v[1].second.first) counter[v[0].first]++;
  for (int i = 1; i < m - 1; i++) {
    counter[v[i].first] += (int)(v[i].second.first == v[i + 1].second.first) +
                           (int)(v[i].second.first == v[i - 1].second.first);
  }
  if (v[m - 1].second.first == v[m - 2].second.first) counter[v[m - 1].first]++;
  sort(v.begin(), v.end(), COLUMN);
  if (v[0].second.second == v[1].second.second) counter[v[0].first]++;
  for (int i = 1; i < m - 1; i++) {
    counter[v[i].first] += (int)(v[i].second.second == v[i + 1].second.second) +
                           (int)(v[i].second.second == v[i - 1].second.second);
  }
  if (v[m - 1].second.second == v[m - 2].second.second)
    counter[v[m - 1].first]++;
  sort(v.begin(), v.end(), DIAG);
  if (v[0].second.first - v[0].second.second ==
      v[1].second.first - v[1].second.second)
    counter[v[0].first]++;
  for (int i = 1; i < m - 1; i++) {
    counter[v[i].first] +=
        (int)(v[i].second.first - v[i].second.second ==
              v[i + 1].second.first - v[i + 1].second.second) +
        (int)(v[i].second.first - v[i].second.second ==
              v[i - 1].second.first - v[i - 1].second.second);
  }
  if (v[m - 1].second.first - v[m - 1].second.second ==
      v[m - 2].second.first - v[m - 2].second.second)
    counter[v[m - 1].first]++;
  sort(v.begin(), v.end(), ANTI);
  if (v[0].second.first + v[0].second.second ==
      v[1].second.first + v[1].second.second)
    counter[v[0].first]++;
  for (int i = 1; i < m - 1; i++) {
    counter[v[i].first] +=
        (int)(v[i].second.first + v[i].second.second ==
              v[i + 1].second.first + v[i + 1].second.second) +
        (int)(v[i].second.first + v[i].second.second ==
              v[i - 1].second.first + v[i - 1].second.second);
  }
  if (v[m - 1].second.first + v[m - 1].second.second ==
      v[m - 2].second.first + v[m - 2].second.second)
    counter[v[m - 1].first]++;
  int val[10] = {};
  for (int i = 0; i < m; i++) val[counter[i]]++;
  for (int i = 0; i <= 8; i++) printf("%d ", val[i]);
  printf("\n");
  return 0;
}
