#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define ll long long
#define all(x) x.begin(),x.end()
#define file(name) freopen(name".inp","r",stdin);freopen(name".out","w",stdout);
using namespace std;
const int MOD=1e9+7;
const int inf=1e9+36;
const ll INF=1e18+36;
const long double EPS=1e-15;
const int N=1e6+5;
int minmize(int a,int b){
return a<b?a:b;
}
int maxmize(int a,int b){
return a>b?a:b;
}
ll Minmize(ll a,ll b){
return a<b?a:b;
}
ll Maxmize(ll a,ll b){
return a>b?a:b;
}
int n,m,s[N],node[N],ans[N];
vector<int>adj[N];
bool active[N];
bool cmp(int u,int v){
return s[u]<s[v];
}
struct DSU{
int n;
vector<int>parent,sz;
vector<vector<int>>k;
DSU(int _n){
n=_n;
parent.assign(n+1,0);
sz.assign(n+1,1);
k.resize(n+1);
for(int i=1;i<=n;++i){
parent[i]=i;
sz[i]=s[i];
k[i].push_back(i);
}
}
int findV(int v){
return parent[v]==v?v:parent[v]=findV(parent[v]);
}
bool unite(int u,int v,int l){
u=findV(u);
v=findV(v);
if(u==v)
return false;
if(sz[u]<sz[v])
swap(u,v);
if(sz[v]<l)
for(int x:k[v])
ans[x]=0;
if(k[u].size()<k[v].size())
swap(k[u],k[v]);
for(int x:k[v])
k[u].push_back(x);
parent[v]=u;
sz[u]+=sz[v];
return true;
}
};
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//file("");
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>s[i];
node[i]=i;
ans[i]=1;
}
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
sort(node+1,node+1+n,cmp);
DSU dsu(n);
for(int i=1;i<=n;++i){
int u=node[i];
for(int v:adj[u])
if(s[v]<=s[u])
dsu.unite(u,v,s[u]);
}
for(int u=1;u<=n;++u)
cout<<ans[u];
return 0;
}