#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pi pair<int, int>
#define pl pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(),(x).end()
const int maxn=2e5+10;
vector<set<int>> ok(maxn);
vector<vi> graph(maxn);
vl sums(maxn,0);
vl vals(maxn,0);
vi head(maxn);
int get(int a) {
return (a==head[a]?a:head[a]=get(head[a]));
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
iota(all(head),0);
int n,m;
cin >> n >> m;
for (int i=0; i<n; i++) {
cin >> sums[i];
vals[i]=sums[i];
ok[i].insert(i);
}
int a,b;
for (int i=0; i<m; i++) {
cin >> a >> b;
graph[--a].pb(--b);
graph[b].pb(a);
}
vi ord(n);
iota(all(ord),0);
sort(all(ord),[&](int a, int b){return sums[a]<sums[b];});
for (int i=0; i<n; i++) {
for (auto to:graph[ord[i]]) {
if (vals[to]>vals[ord[i]]) {
continue;
}
int a=get(to);
int b=get(ord[i]);
if (a==b) {
continue;
}
if (sums[a]<vals[ord[i]]) {
ok[a].clear();
}
sums[b]+=sums[a];
head[a]=b;
if (ok[b].size()<ok[a].size()) {
swap(ok[a],ok[b]);
}
for (auto add:ok[a]) {
ok[b].insert(add);
}
}
}
int rt=get(0);
for (int i=0; i<n; i++) {
cout << ok[rt].count(i);
}
cout << '\n';
}
# | 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... |