#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct DSU {
int n;
vector<int> l, d;
vector<ll> s;
vector<bool> m;
DSU(int _n, vector<ll> _s) : n(_n), l(n), d(n, 1), s(_s), m(n, false) {
iota(begin(l), end(l), 0);
}
int find(int v) {
if (l[v] == v)
return v;
l[v] = find(l[v]);
m[v] = m[v] || m[l[v]];
return l[v];
}
void merge(int v, int u) {
v = find(v);
u = find(u);
if (u == v)
return;
l[v] = u;
d[u] += d[v];
s[u] += s[v];
}
};
int main() {
int N, M;
cin >> N >> M;
vector<ll> S(N);
for (int i = 0; i < N; i++) {
cin >> S[i];
}
vector<vector<int>> adj(N);
for (int i = 0, x, y; i < M; i++) {
cin >> x >> y; x--; y--;
adj[x].push_back(y);
adj[y].push_back(x);
}
vector<int> idx(N);
iota(begin(idx), end(idx), 0);
sort(begin(idx), end(idx), [&] (int i, int j) { return S[i] < S[j]; });
DSU dsu(N, S);
vector<bool> add(N, false);
for (int i = 0; i < N; i++) {
int v = idx[i];
add[v] = true;
for (int u: adj[v]) {
if (!add[u])
continue;
if (S[u] < S[v]) {
int p = dsu.find(u);
if (dsu.s[p] < S[v])
dsu.m[p] = true;
}
dsu.merge(u, v);
}
}
for (int i = 0; i < N; i++) {
dsu.find(i);
cout << !dsu.m[i];
}
cout << '\n';
return 0;
}
| # | 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... |