#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second
#define ld long double
const int MAXN = 2e5;
const ll INF = 1e18;
const int MOD = 998244353;
ll a[MAXN + 5], act[MAXN + 5], sum[MAXN + 5];
vector<ll> adj[MAXN + 5];
struct DSU{
	ll N;
	vector<ll> par;
	vector<set<ll>> ans;
	DSU(ll _n){
		N = _n;
		par.resize(N + 5);
		ans = vector<set<ll>> (N + 5);
		for(int i = 1; i <= N; i++){
			par[i] = i;
			ans[i].insert(i);
		}
	}
	ll find(ll idx){
		return (par[idx] == idx ? idx : par[idx] = find(par[idx]));
	}
	bool join(ll a, ll b, ll weight){
		a = find(a), b = find(b);
		if(a == b) return false;
		// gabisa makan
		if(sum[a] < weight){
			ans[a].clear();
		}
		if(sum[b] < weight){
			ans[b].clear();
		}
		
		if(ans[b].size() > ans[a].size()){
			swap(a, b);
		}
		sum[a] += sum[b];
		par[b] = a;
		for(auto &i : ans[b]){
			ans[a].insert(i);
		}
		ans[b].clear();
		return true;
	}
};
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int tc = 1;	
	// cin >> tc;
	for(;tc--;){
		ll N, M; cin >> N >> M;
		for(int i = 1; i <= N; i++){
			cin >> a[i];
			sum[i] = a[i];
		}
		vector<pair<ll, pii>> edges;
		for(int i = 1; i <= M; i++){
			ll u, v; cin >> u >> v;
			edges.push_back({max(a[u], a[v]), {u, v}});
		}
		
		sort(edges.begin(), edges.end());
		
		DSU dsu(N);
		for(auto [weight, cur] : edges){
			dsu.join(cur.fi, cur.sec, weight);
		}
		
		for(int i = 1; i <= N; i++){
			ll get = dsu.find(i);
			cout << bool(dsu.ans[get].find(i) != dsu.ans[get].end());
		}
		cout << "\n";
	}	
}
/*
*/
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |