#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
#define dd2(x,y) cout<<#x<<" is "<<x<<" "<<#y<<" is "<<y<<endl;
typedef pair<int,int> pii;
const int N = 2e5+5;
int a[N], p[N], lastupd[N], sum[N], dead[N];
vector<int>adj[N];
int n;
struct edge{
int u,v,w;
};
bool cmp(edge a, edge b){
return a.w < b.w;
}
int fs(int x){
if(p[x] == x) return x;
return p[x] = fs(p[x]);
}
void merge(int u, int v){
int gu = fs(u), gv = fs(v);
if(gu == gv) return;
int curupd = a[u];
if(lastupd[gv] != curupd){
if(sum[gv] < curupd){
dead[gv] = 1;
}
}
adj[gv].pb(gu); adj[gu].pb(gv);
p[gv] = gu;
sum[gu] += sum[gv];
}
void dfs(int x, int p){
for(auto i: adj[x]){
if(i == p) continue;
if(dead[x]) dead[i] = 1;
dfs(i,x);
}
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0);
int m; cin>>n>>m;
for(int i=1; i<=n; i++) cin>>a[i];
if(n == 1){
cout<<1;
return 0;
}
edge edges[m];
for(int i=0; i<m; i++){
int u,v; cin>>u>>v;
if(a[u] < a[v]) swap(u,v); //a[u] is larger
edges[i] = {u,v,a[u]};
}
sort(edges, edges+m, cmp);
for(int i=1; i<=n; i++){
p[i] = i, sum[i] = a[i], lastupd[i] = a[i];
}
for(int i=0; i<m; i++){
auto[u,v,w] = edges[i];
merge(u,v);
}
dfs(edges[m-1].u,-1);
for(int i=1; i<=n; i++) cout << ((dead[i]) ? 0 : 1);
return 0;
}