#include <bits/stdc++.h>
using namespace std;
#define MAX 200200
#define int long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define __buitin_popcount __builtin_popcountll
#define BIT(x,i) (((x)>>(i))&1ll)
#define MASK(i) (1ll<<(i))
template<class X,class Y> bool maximize(X &x,Y y)
{
if(x<y)
{
x=y;
return 1;
}
return 0;
}
template<class X,class Y> bool minimize(X &x,Y y)
{
if(y<x)
{
x=y;
return 1;
}
return 0;
}
const int inf=1e9+412009;
const int INF=2e18+412009;
struct DSU
{
vector<int> par,sz,sum;
DSU(int n=0,int a[]={})
{
par.assign(n+1,0);
sz.assign(n+1,1);
sum.assign(n+1,0);
for(int i=1;i<=n;i++) par[i]=i,sum[i]=a[i];
}
int find_set(int a)
{
if(par[a]==a) return a;
int p=find_set(par[a]);
par[a]=p;
return p;
}
bool union_set(int a,int b)
{
a=find_set(a);
b=find_set(b);
if(b==a) return 0;
par[b]=a;
sz[a]+=sz[b];
sum[a]+=sum[b];
return 1;
}
int get_sum(int a)
{
a=find_set(a);
return sum[a];
}
int get_size(int a)
{
a=find_set(a);
return sz[a];
}
};
struct EDGE
{
int u,v;
int other(int x)
{
assert(x==u||x==v);
return u+v-x;
}
};
EDGE edge[MAX];
int n,m;
int sz[MAX];
vector<int> adj[MAX];
DSU dsu;
void nhap()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>sz[i];
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
edge[i]={u,v};
adj[u].push_back(i);
adj[v].push_back(i);
}
}
map<int,vector<int>> cursz,mp ;
bool ans[MAX]={};
void solve()
{
dsu=DSU(n,sz);
for(int i=1;i<=n;i++)
{
cursz[sz[i]].push_back(i);
mp[sz[i]].push_back(i);
}
for(auto i:cursz)
{
for(int u:mp[i.fi]) for(int id:adj[u])
{
int v=edge[id].other(u);
if(sz[v]<=i.fi) dsu.union_set(u,v);
}
for(int u:i.se)
{
int new_weight=dsu.get_sum(u);
if(new_weight>i.fi) cursz[new_weight].push_back(u);
else if(dsu.get_size(u)==n) ans[u]=1;
}
}
for(int i=1;i<=n;i++) cout<<ans[i];
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
nhap();
solve();
return 0;
}