#include<iostream>
using namespace std;
const int MAX=2e5+10;
int cnt[MAX];
int ans[MAX];
int a[MAX];
int main() {
int n,m,zero=0,one=0;
cin>>n>>m;
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
if(a[i]==0)zero++;
else one++;
}
while(m--) {
int x,y;
scanf("%d%d",&x,&y);
if(a[x]!=a[y]) {
cnt[x]++;//记录每个点的桥
cnt[y]++;
}
}
int A=0,B=0;
for(int i=1; i<=n; i++) {
if(a[i]==0&&cnt[i])A++;//0类,而且有桥,
if(a[i]==1&&cnt[i])B++;//1类,数量
}
for(int i=1; i<=n; i++) {
ans[i]+=cnt[i];//与异类相连的桥的数目,也就是步数
if(a[i]==0)ans[i]+=zero-1;//加同类
else ans[i]+=one-1;//同类
if(cnt[i]==0) {//如果 这个站没有建桥
if(a[i]==0) {//如果是0类
ans[i]+=2*B;//一个点只算建在上面的一座桥,其他为在一个点上重复建桥的
ans[i]+=3*(one-B);//
} else {
ans[i]+=2*A;
ans[i]+=3*(zero-A);
}
} else {//如果这个点建桥了
if(a[i]==0)ans[i]+=2*(one-cnt[i]);
//如果是0类, 那么到1类的其他点的距离就是2
else ans[i]+=2*(zero-cnt[i]);
}
}
for(int i=1; i<=n; i++)
cout<<ans[i]<<" ";
return 0;
}