#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;
}
struct DSU{
int n;
vector<int>parent,sz;
DSU(int _n){
n=_n;
parent.assign(n+1,0);
sz.assign(n+1,1);
for(int i=1;i<=n;++i)
parent[i]=i;
}
int findV(int v){
return parent[v]==v?v:parent[v]=findV(parent[v]);
}
bool unite(int u,int v){
u=findV(u);
v=findV(v);
if(u==v)
return false;
if(sz[u]<sz[v])
swap(u,v);
parent[v]=u;
sz[u]+=sz[v];
return true;
}
bool same(int u,int v){
return findV(u)==findV(v);
}
};
int n,m,s[N],up[22][N],lg,cnt;
ll mx[N],sum[N],nxt[N],ans[N],timer,tin[N],tout[N],node[N],p[N];
vector<int>adj[N];
bool active[N];
bool cmp1(int u,int v){
if(s[u]==s[v])
return u<v;
return s[u]<s[v];
}
bool cmp2(int u,int v){
if(sum[u]==sum[v])
return u<v;
return sum[u]>sum[v];
}
int jump(int u,ll k){
for(int i=lg;i>=0;--i){
int v=up[i][u];
if(v&&mx[v]<=k)
u=v;
}
return u;
}
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];
for(int i=1;i<=m;++i){
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int u=1;u<=n;++u){
node[u]=u;
mx[u]=s[u];
sum[u]=s[u];
}
int cur=n;
DSU dsu(n<<1|1);
sort(node+1,node+1+n,cmp1);
for(int i=1;i<=n;++i){
int u=node[i];
tin[u]=++timer;
active[u]=true;
vector<int>child;
for(int v:adj[u])
if(active[v]){
v=dsu.findV(v);
if(tin[v]!=timer){
tin[v]=timer;
child.push_back(v);
}
}
if(child.empty())
continue;
++cur;
dsu.parent[cur]=cur;
mx[cur]=s[u];
sum[cur]=s[u];
p[cur]=0;
for(int v:child){
dsu.parent[v]=cur;
p[v]=cur;
sum[cur]+=sum[v];
}
dsu.parent[u]=cur;
p[u]=cur;
sum[cur]+=sum[u];
tout[u]=timer;
}
int root=dsu.findV(1);
for(int u=1;u<=cur;++u)
up[0][u]=p[u];
while((1<<lg)<=cur)
++lg;
for(int i=1;i<=lg;++i)
for(int u=1;u<=cur;++u)
up[i][u]=up[i-1][up[i-1][u]];
for(int u=1;u<=cur;++u){
nxt[u]=jump(u,sum[u]);
node[u]=u;
}
sort(node+1,node+1+cur,cmp2);
vector<char>ans(cur+1,'0');
for(int i=1;i<=cur;++i){
int u=node[i];
if(nxt[u]==u){
if(u==root)
ans[u]='1';
}
else
ans[u]=ans[nxt[u]];
}
for(int u=1;u<=n;++u)
cout<<ans[u];
return 0;
}