///因为这道题的键值很大所以用数组来实现hash是不现实的,这时我们就要用map<node, int>
///来实现hash
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <map>
#include <stack>
#include <math.h>
using namespace std;
struct node{
int x, y;
bool operator < (const node& other) const{//map中的key一定要有大小之分,像node这种类型本身无大小
if(x!=other.x) //则需要定义他们元素之间大小的规则
return x < other.x;
else
return y < other.y;
}
}s[1010];
map<node, int> h;
int dir[4][2]={{-1,0}, {0,-1}, {1,0}, {0,1}};
bool fun(node t)
{
for(int i=0; i<4; i++)
{
node point;
point.x=t.x+dir[i][0];
point.y=t.y+dir[i][1];
if(h.find(point)==h.end())//h.find(key)返回键为key的映射迭代器,用h.count(point)==0是同样的效果
return false;
}
node point;
point.x=t.x+1;
point.y=t.y+1;
if(h.count(point))//h.count(key)返回键为key的是否存在,存在返回1,不存在返回0
h[t]++;
point.x=t.x+1;
point.y=t.y-1;
if(h.count(point))
h[t]++;
point.x=t.x-1;
point.y=t.y+1;
if(h.count(point))
h[t]++;
point.x=t.x-1;
point.y=t.y-1;
if(h.count(point))
h[t]++;
return true;
}
int main()
{
int n, cnt[10];
memset(cnt, 0, sizeof(cnt));
cin >> n;
for(int i=0; i<n; i++)
{
cin >> s[i].x >> s[i].y;
h[s[i]]=0;
}
map<node, int>::iterator it=h.begin();
for(; it!=h.end(); it++)
{
if(fun(it->first))
cnt[it->second]++;
}
for(int i=0; i<=4; i++)
cout << cnt[i] << endl;
return 0;
}