#include<iostream>
#include<map>
using namespace std;
struct Node{
int x,y;
Node(){
}
Node(int a,int b){
x=a;
y=b;
}
bool operator < (const Node& other) const{
if(x!=other.x)
return x<other.x;
else
return y<other.y;
}
};
map<Node,int> mp;
map<Node,int>::iterator it;
int count[5]={0};//存储各得分数目
int xway[4]={0,0,1,-1};
int yway[4]={1,-1,0,0};
bool fun(Node node){
for(int i=0;i<4;i++){
int x=node.x+xway[i],y=node.y+yway[i];
if(mp.find(Node(x,y))==mp.end())
return false;
}
if(mp.find(Node(node.x+1,node.y+1))!=mp.end())
mp[node]++;
if(mp.find(Node(node.x-1,node.y+1))!=mp.end())
mp[node]++;
if(mp.find(Node(node.x+1,node.y-1))!=mp.end())
mp[node]++;
if(mp.find(Node(node.x-1,node.y-1))!=mp.end())
mp[node]++;
return true;
}
int main(){
int n,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
mp[Node(x,y)]=0;
}
for(it=mp.begin();it!=mp.end();it++){
if(fun(it->first)){
count[it->second]++;
}
}
for(int i=0;i<5;i++)
cout<<count[i]<<endl;
return 0;
}