#include <bits/stdc++.h>   using namespace std;   vector<int> x[100100], y[100100];   vector<int> p[100100], q[100100], v[100100], w[100100];   int a[100100], b[100100], c[100100];   map<pair<int, int>, int> mp;   void solve() {     mp.clear();     int n, m;     scanf( %d%d , &n, &m);     for (int i = 0; i < m; i++) {       scanf( %d%d , &a[i], &b[i]);       x[a[i]].push_back(b[i]);       y[b[i]].push_back(a[i]);       if (a[i] + b[i] <= n + 1) {         int o = a[i] - 1, oo = o + b[i];         p[oo].push_back(b[i]);       } else {         int oo = n - b[i], o = a[i] - oo;         q[o].push_back(a[i]);       }       if (a[i] <= b[i]) {         int o = a[i] - 1, oo = b[i] - o;         v[oo].push_back(b[i]);       } else {         int oo = b[i], o = a[i] - oo + 1;         w[o].push_back(a[i]);       }     }     for (int i = 1; i <= n; i++) {       if (x[i].size() <= 1) continue;       sort(x[i].begin(), x[i].end());       for (int j = 0; j < x[i].size(); j++) {         int xx = i, yy = x[i][j];         if (j == 0 || j == x[i].size() - 1) {           mp[make_pair(xx, yy)]++;         } else {           mp[make_pair(xx, yy)] += 2;         }       }     }     for (int i = 1; i <= n; i++) {       if (y[i].size() <= 1) continue;       sort(y[i].begin(), y[i].end());       for (int j = 0; j < y[i].size(); j++) {         int xx = y[i][j], yy = i;         if (j == 0 || j == y[i].size() - 1) {           mp[make_pair(xx, yy)]++;         } else {           mp[make_pair(xx, yy)] += 2;         }       }     }     for (int i = 1; i <= n; i++) {       if (p[i].size() <= 1) continue;       sort(p[i].begin(), p[i].end());       for (int j = 0; j < p[i].size(); j++) {         int yy = p[i][j];         int xx = i - yy + 1;         if (j == 0 || j == p[i].size() - 1) {           mp[make_pair(xx, yy)]++;         } else {           mp[make_pair(xx, yy)] += 2;         }       }     }     for (int i = 1; i <= n; i++) {       if (q[i].size() <= 1) continue;       sort(q[i].begin(), q[i].end());       for (int j = 0; j < q[i].size(); j++) {         int xx = q[i][j];         int yy = n - (xx - i);         if (j == 0 || j == q[i].size() - 1) {           mp[make_pair(xx, yy)]++;         } else {           mp[make_pair(xx, yy)] += 2;         }       }     }     for (int i = 1; i <= n; i++) {       if (v[i].size() <= 1) continue;       sort(v[i].begin(), v[i].end());       for (int j = 0; j < v[i].size(); j++) {         int yy = v[i][j];         int xx = yy - i + 1;         if (j == 0 || j == v[i].size() - 1) {           mp[make_pair(xx, yy)]++;         } else {           mp[make_pair(xx, yy)] += 2;         }       }     }     for (int i = 1; i <= n; i++) {       if (w[i].size() <= 1) continue;       sort(w[i].begin(), w[i].end());       for (int j = 0; j < w[i].size(); j++) {         int xx = w[i][j];         int yy = xx - i + 1;         if (j == 0 || j == w[i].size() - 1) {           mp[make_pair(xx, yy)]++;         } else {           mp[make_pair(xx, yy)] += 2;         }       }     }     map<pair<int, int>, int>::iterator iter;     iter = mp.begin();     int s = 0;     while (iter != mp.end()) {       int o = iter->second;       pair<int, int> v = iter->first;       c[o]++;       s++;       iter++;     }     printf( %d , m - s);     for (int i = 1; i < 9; i++) printf(  %d , c[i]);   }   int main() { solve(); }