#include <bits/stdc++.h>
#define int long long
std::vector<int> adj[200010];
int arr[200010];
bool pos[200010];
bool impos[200010];
bool visit[200010];
std::vector<std::pair<int,int>> srt;
void dfs(int curr,int par,int ps){
pos[curr]=true;
for(auto to:adj[curr]){
if(pos[to]||to==par||arr[to]>arr[curr])continue;
dfs(to,curr,arr[curr]);
}
}
bool bfs(int curr){
if(pos[curr])return true;
if(impos[curr])return false;
visit[curr]=true;
std::stack<int> st;
int size=arr[curr];
int minneed=1e9;
std::priority_queue<std::pair<int,int>> pq;
pq.push({0,curr});
bool posb=true;
while(!pq.empty()){
int tsize = -pq.top().first;
int curr = pq.top().second;
pq.pop();
visit[curr]=true;
if(tsize>size){
posb=false;
break;
}
size+=tsize;
if(pos[curr]||size>minneed){
posb=true;
break;
}
visit[curr]=true;
st.push(curr);
for(auto to:adj[curr]){
if(pos[to])minneed=std::min(minneed,arr[to]);
if(visit[to])continue;
pq.push({-arr[to],to});
}
}
if(posb){
dfs(curr,curr,arr[curr]);
while(!st.empty())visit[st.top()]=false,st.pop();
}
else{
while(!st.empty())impos[st.top()]=true,visit[st.top()]=false,st.pop();
}
return pos[curr];
}
signed main() {
int n,m;
std::cin >> n >> m;
std::vector<std::pair<int,bool>> ans;
for(int i=1;i<=n;i++){
std::cin >> arr[i];
srt.push_back({arr[i],i});
}
std::sort(srt.begin(),srt.end());
for(int i=1;i<=m;i++){
int a,b;
std::cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
for(auto [s,node]:srt){
ans.push_back({node,bfs(node)});
}
std::sort(ans.begin(),ans.end());
for(auto [num,s]:ans){
if(s)std::cout << 1;
else std::cout << 0;
}
}