#include<iostream>
#include<stdio.h>
using namespace std;
int a[15005],b[15005],c[15005],d[15005],w[15005],h[40005],n,m,x,y;
//abcd表示某个点作为abcd物品出现的次数;w表示数轴上每个点出现的次数;h表示每个物品的魔法值
//n表示最大魔法值,m表示物品数量
int main()
{
cin>>n>>m;
if(n<11)
{
for(int i=1;i<=m;i++) printf("0 0 0 0\n");
return 0;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&h[i]);
w[h[i]]++;
}//把这些点标记在数轴上
for(int i=1;i<=n/9;i++)
{
//若数轴上有一个魔法阵:ABCD,其中有AB=2*CD,BC>6*CD
//所以只需枚举CD的长度就可以了
x=1+9*i,y=0;//x为AD最短长度
for(int j=2+9*i;j<=n;j++)
{
//因为数轴是从1开始的,所以从1+x开始枚举
//枚举D点即j,则C点为j-i,A点为j-x,B点为j-x+2*i
//CD的个数取决于AB有多少组,所以我们用y表示AB的组数
y+=w[j-x]*w[j-x+i+i];//y为AB的对数
//D点是不定的。但是D点变化时,之前合格的AB两点仍然合格,所以要累加
d[j]+=y*w[j-i];//有几组AB,就有几个C点,就有几个D点
c[j-i]+=y*w[j];//有几组AB,就有几个D点,就有几个C点
}
//注意,魔法值可能重复,所以在加的时候,注意不要直接加。
//同理,枚举CD两点,确定AB的个数
x=8*i+1,y=0;
for(int j=n-9*i-1;j>=1;j--)
{
y+=w[j+x]*w[j+x+i];
a[j]+=y*w[j+i+i];
b[j+i+i]+=y*w[j];
}
}
for(int i=1;i<=m;i++)//输出每个物品对应的魔法值的作为abcd物品的次数
cout<<a[h[i]]<<' '<<b[h[i]]<<' '<<c[h[i]]<<' '<<d[h[i]]<<endl;
}