This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#ifndef LOCAL
#include "split.h"
#endif // LOCAL
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define ar array
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int maxn = 1e5 + 5;
class DSU
{
public:
  vector<int> lab;
  DSU(int n)
  {
    lab.assign(n, -1);
  }
  int finds(int u)
  {
    if(lab[u] < 0) return u;
    return lab[u] = finds(lab[u]);
  }
  bool merges(int u, int v)
  {
    u = finds(u); v = finds(v);
    if(u == v) return false;
    if(lab[v] < lab[u]) swap(u, v);
    lab[u] += lab[v]; lab[v] = u;
    return true;
  }
  bool same(int u, int v)
  {
    return (finds(u) == finds(v));
  }
  int sz(int x)
  {
    return -lab[finds(x)];
  }
};
int sz[maxn], par[maxn];
vector<int> adj[maxn];
int findcen(int mxsize)
{
  function<void(int)> dfs = [&](int u)
  {
    sz[u] = 1;
    for(int v : adj[u]) if(v != par[u]){
      par[v] = u;
      dfs(v);
      sz[u] += sz[v];
    }
  };
  dfs(0);
  int u = 0;
  while(true){
    ii mx = mp(-1, -1);
    for(int v : adj[u]) if(v != par[u]){
      mx = max(mx, mp(sz[v], v));
    }
    if(mx.fi <= mxsize) return u;
    u = mx.se;
  }
  assert(0);
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) {
  DSU dsu(n);
  vector<int> col(n, 0);
  int m = p.size();
  int ca, cb, cc;
  {
    vector<ii> v;
    v.eb(a, 1); v.eb(b, 2); v.eb(c, 3);
    sort(v.begin(), v.end());
    tie(a, ca) = v[0]; tie(b, cb) = v[1];
    tie(c, cc) = v[2];
  }
  for(int i = 0; i < m; ++i){
    if(dsu.merges(p[i], q[i])){
      adj[p[i]].eb(q[i]);
      adj[q[i]].eb(p[i]);
    }
  }
  dsu = DSU(n);
  int r = findcen(n - b);
  for(int i = 0; i < n; ++i){
    for(int j : adj[i]){
      if(i != r && j != r){
        dsu.merges(i, j);
      }
    }
  }
  for(int i = 0; i < m; ++i){
    int u = p[i], v = q[i];
    if(dsu.sz(u) >= a || dsu.sz(v) >= a) continue;
    if(u == r || v == r) continue;
    if(dsu.merges(u, v)){
      adj[u].eb(v); adj[v].eb(u);
    }
  }
  function<void(int, int &, int, int)> go = [&](int u, int & need, int co, int bad)
  {
    if(u == bad || need == 0 || col[u] != 0) return;
    col[u] = co;
    --need;
    for(int v : adj[u]) go(v, need, co, bad);
  };
  for(int v : adj[r]) if(dsu.sz(v) >= a){
    go(v, a, ca, r);
    go(r, b, cb, -1);
    for(int i = 0; i < n; ++i)
      if(col[i] == 0) col[i] = cc;
    break;
  }
  return col;
}
#ifdef LOCAL
signed main(void)
{
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  #ifdef LOCAL
    freopen("A.INP", "r", stdin);
    freopen("A.OUT", "w", stdout);
  #endif // LOCAL
  int n, m, a, b, c; cin >> n >> m >> a >> b >> c;
  vector<int> x(m), y(m);
  for(int i = 0; i < m; ++i) cin >> x[i];
  for(int i = 0; i < m; ++i) cin >> y[i];
  vector<int> res = find_split(n, a, b, c, x, y);
  for(auto & it : res) cout << it << ' ';
}
#endif // LOCAL
| # | 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... |