#include <bits/stdc++.h>
#define int long long
#define arr3 array <int , 3>
#define pii pair <int , int>
#define fi first
#define se second
#define BIT(x , k) ((x >> k)&1)
#define MASK(x) (1 << x)
using namespace std;
const int maxn = 2e6 + 7;
const int INF = 1e18;
int parent[maxn] , sum[maxn];
set <pii> adj[maxn];
int find_set(int u)
{
if(parent[u] == u) return u;
return find_set(parent[u]);
}
void join(int u , int v)
{
u = find_set(u);
v = find_set(v);
if(u == v) return;
if(adj[u].size() < adj[v].size()) swap(u , v);
parent[v] = u;
sum[u] += sum[v];
}
vector <int> check[maxn];
int n , m , s[maxn] , ans[maxn];
vector <pii> ord;
vector <int> g[maxn];
void dfs(int u)
{
ans[u] = 1;
for(int v: check[u])
{
if(ans[v] == 0)
{
dfs(v);
}
}
}
void solve()
{
cin >> n >> m;
int max_s = 0;
for(int i = 1; i <= n; i++)
{
cin >> s[i];
max_s = max(max_s , s[i]);
ord.push_back({s[i] , i});
}
for(int i = 1; i <= m; i++)
{
int u , v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
sort(ord.begin() , ord.end());
for(int i = 1; i <= n; i++)
{
parent[i] = i;
sum[i] = s[i];
for(int v: g[i]) adj[i].insert({s[v] , v});
}
for(int i = 0; i < n;)
{
int j = i;
while(j < n && ord[j].fi == ord[i].fi)
{
int u = ord[j].se;
for(int v: g[u])
{
if(s[v] <= s[u]) join(v , u);
}
j++;
}
for(int k = i; k < j; k++)
{
int u = ord[k].se;
//cout << u << ':';
auto it = adj[find_set(u)].upper_bound({sum[find_set(u)] , INF});
if(it == adj[find_set(u)].begin()) continue;
it--;
if((*it).fi > s[u])
{
check[(*it).se].push_back(u);
check[u].push_back((*it).se);
}
//cout << (*it).se << ' ';
}
//cout << '\n';
i = j;
}
for(int i = 1; i <= n; i++)
{
if(s[i] == max_s) dfs(i);
}
for(int i = 1; i <= n; i++) cout << ans[i];
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr); solve();
return 0;
}