#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) : n(_n), l(n), d(n, 1), s(n, -1), m(n, false) {
iota(begin(l), end(l), 0);
}
int find(int v) {
if (l[v] == v)
return v;
int p = find(l[v]);
m[v] = m[v] || m[l[v]];
return l[v] = p;
}
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<int> 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);
for (int i = 0; i < N; i++) {
int v = idx[i];
dsu.s[v] = S[v];
for (int u: adj[v]) {
if (dsu.s[u] == -1)
continue;
int p = dsu.find(u);
if (S[u] < S[v] && 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... |