

//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
const int N=5e4+7;
const int maxn=1e5+5;
const double EPS=1e-10;
const double Pi=3.1415926535897;
//inline double max(double a,double b){
// return a>b?a:b;
//}
//inline double min(double a,double b){
// return a<b?a:b;
//}
int xd[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int yd[8] = {1, 0, -1, 0, -1, 1, -1, 1};
//void Fire(){
// queue<node> p;
// p.push({fx,fy,0});
// memset(fire, -1, sizeof(fire));
// fire[fx][fy]=0;
// while(!p.empty()){
// node temp=p.front();
// p.pop();
// for(int i=0;i<8;i++){
// int x=temp.x+xd[i];
// int y=temp.y+yd[i];
// if(x<0||x>=n||y<0||y>=m||fire[x][y]!=-1){
// continue;
// }
// fire[x][y]=temp.val+1;
// p.push({x,y,temp.val+1});
// }
// }
//}
//int bfs(){
// queue<node> p;
// memset(vis, 0, sizeof(vis));
// p.push({sx,sy,0});
// while (!p.empty()) {
// node temp=p.front();
// vis[temp.x][temp.y]=1;
// p.pop();
// for(int i=0;i<4;i++){
// int x=temp.x+xd[i];
// int y=temp.y+yd[i];
// if(x<0||x>=n||y<0||y>=m) continue;
// if(x==ex&&y==ey&&temp.val+1<=fire[x][y]) return temp.val+1;
// if(vis[x][y]||temp.val+1>=fire[x][y]||a[x][y]=='#') continue;
// p.push({x,y,temp.val+1});
// }
// }
// return -1;
//}
int arr[5];
struct Node{
int x,y;
}node[1010];
int main(){
int n,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
node[i].x=x;
node[i].y=y;
}
int ans;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(node[i].x+1==node[j].x&&node[i].y==node[j].y)
ans++;
if(node[i].x-1==node[j].x&&node[i].y==node[j].y)
ans++;
if(node[i].x==node[j].x&&node[i].y+1==node[j].y)
ans++;
if(node[i].x==node[j].x&&node[i].y-1==node[j].y)
ans++;
}
if(ans==4){
int cnt;
for(int j=0;j<n;j++){
if(node[i].x+1==node[j].x&&node[i].y+1==node[j].y)
cnt++;
if(node[i].x+1==node[j].x&&node[i].y-1==node[j].y)
cnt++;
if(node[i].x-1==node[j].x&&node[i].y+1==node[j].y)
cnt++;
if(node[i].x-1==node[j].x&&node[i].y-1==node[j].y)
cnt++;
}
arr[cnt]++;
cnt=0;
}
ans=0;
}
for(int i=0;i<5;i++){
cout<<arr[i]<<endl;
}
}