#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
typedef pair<int,int> pii;
const int N = 2e5+5;
int a[N], ans[N];
int n;
void dfs(int x, vector<pii> &edges, vector<pii> &newedges, set<int> &vis){
pii p = {x,0};
int id = lower_bound(edges.begin(), edges.end(), p) - edges.begin();
while(id < edges.size() and edges[id].first == x){
auto[u,v] = edges[id];
if(vis.find(v) == vis.end()){
id++;
continue;
}
vis.erase(v);
newedges.pb({u,v});
newedges.pb({v,u});
dfs(v,edges,newedges,vis);
id++;
}
}
void findsum(int x, int &sum, vector<pii> &edges, set<int> &vis){
sum += a[x];
pii p = {x,0};
int id = lower_bound(edges.begin(),edges.end(),p) - edges.begin();
while(id < edges.size() and edges[id].first == x){
auto[u,v] = edges[id];
if(vis.find(v) != vis.end()){
id++;
continue;
}
vis.insert(v);
findsum(v, sum, edges, vis);
id++;
}
}
void recurse(vector<pii> &edges, int x){
int mxnode = -1, mx = 0;
for(int i=0; i<edges.size(); i++){
auto [u,v] = edges[i];
if(a[u] > mx) mx = a[u], mxnode = u;
}
if(mxnode == -1) return;
int sum = 0;
set<int> vis;
vis.insert(mxnode);
findsum(mxnode, sum, edges, vis);
if(sum < x) return;
vector<pii> edges1;
vis = set<int>();
for(int i=0; i<edges.size(); i++){
auto[u,v] = edges[i];
if(a[u] == mx or a[v] == mx){
if(a[u] == mx) ans[u] = 1;
if(a[v] == mx) ans[v] = 1;
} else {
edges1.pb({u,v});
vis.insert(u);
}
}
/*cout<<"adj1 (removed edges):" <<endl;
for(int i=1; i<=n; i++){
for(auto j: adj1[i]) cout<<i<<' '<<j<<endl;
}
cout<<"--------"<<endl;*/
while(vis.size()){
int i = *vis.begin();
vis.erase(i);
vector<pii> newedges;
dfs(i, edges1, newedges, vis);
/*dd(mxnode)
cout<<"vis"<<endl;
for(int i=1; i<=n; i++) cout<<vis[i]<<" ";cout<<endl;
cout<<"newadj (within adj1):"<<endl;
for(int i=1; i<=n; i++){
for(auto j: newadj[i]) cout<<i<<' '<<j<<endl;
}
cout<<"---------"<<endl;*/
recurse(newedges, mx);
}
}
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];
vector<pii>edges;
for(int i=0; i<m; i++){
int u,v; cin>>u>>v;
edges.pb({u,v});
edges.pb({v,u});
}
sort(edges.begin(), edges.end());
recurse(edges, 0);
for(int i=1; i<=n; i++) cout<<ans[i];
return 0;
}