// GMAI's code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 200005;
int s[MAXN], parent_node[MAXN], ans[MAXN];
long long sum[MAXN];
vector<int> adj[MAXN], graph[MAXN];
bool visited[MAXN];
int find_set(int v) {
return v == parent_node[v] ? v : parent_node[v] = find_set(parent_node[v]);
}
void dfs(int u) {
ans[u] = 1;
for (int v : adj[u]) {
if (!ans[v]) dfs(v);
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, m;
cin >> n >> m;
vector<pair<int, int>> ord(n);
for (int i = 1; i <= n; i++) {
cin >> s[i];
ord[i - 1] = {s[i], i};
parent_node[i] = i;
sum[i] = s[i];
}
for (int i = 0; i < m; i++) {
int u, v; cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
sort(ord.begin(), ord.end());
for (auto p : ord) {
int u = p.second;
visited[u] = true;
for (int v : graph[u]) {
if (visited[v]) {
int root_v = find_set(v), root_u = find_set(u);
if (root_u != root_v) {
if (sum[root_v] >= s[u]) adj[u].push_back(root_v);
sum[root_u] += sum[root_v];
parent_node[root_v] = root_u;
}
}
}
}
dfs(ord.back().second);
for (int i = 1; i <= n; i++) cout << ans[i];
return 0;
}