#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1<<18;
int s[N], Par[N], Sz[N], Ans[N], ans[N], lst, n, m;
vector<pair<int,int>> Vec;
vector<pair<int, pair<int, int>>> E;
int root(int v){
return (Par[v] == v ? v : Par[v] = root(Par[v]));
}
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>s[i], Par[i] = i, Sz[i] = s[i];
s[0] = max(s[0], s[i]);
}
for (int i=1, a, b;i<=m;i++){
cin>>a>>b;
if (s[a] < s[b])
swap(a, b);
E.push_back({s[a], {a, b}});
}
sort(begin(E), end(E));
for (auto [p, ab] : E){
auto [a, b] = ab;
int A = root(a), B = root(b);
if (A == B)
continue;
if (Sz[B] >= s[a])
Vec.push_back({B, a});
Par[B] = A;
Sz[A] += Sz[B];
}
for (int i=1;i<=n;i++)
Ans[i] = (s[i] == s[0]);
reverse(begin(Vec), end(Vec));
for (auto [B, a] : Vec)
Ans[B] |= Ans[a];
for (int i=1;i<=100;i++){
for (int i=1;i<=n;i++)
ans[i] = Ans[i], Par[i] = i;
for (auto [p, ab] : E){
auto [a, b] = ab;
int A = root(a), B = root(b);
if (A == B)
continue;
Par[B] = A;
Ans[A] |= ans[B];
ans[A] |= ans[B];
}
reverse(begin(Vec), end(Vec));
for (auto [B, a] : Vec)
Ans[B] |= Ans[a];
}
for (int i=1;i<=n;i++)
cout<<Ans[i];
cout<<'\n';
}
/*
4 4
1 2 4 6
1 2
1 3
2 3
3 4
*/
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |