#include <bits/stdc++.h>
using namespace std;
#define F0R(i, n) for (int i = 0; i < n;i++)
#define FOR(i,j,n) for (int i = j;i < n;i++)
template<typename T>
using V = vector<T>;
using vi = V<int>;
using pi = pair<int, int>;
void computeSiz(V<vi> &tree, int x, int p, vi &siz, vi &par) {
    siz[x] = 1;
    par[x] = p;
    for (auto y : tree[x]) {
        if (y == p) continue;
        computeSiz(tree, y, x, siz, par);
        siz[x] += siz[y];
    }
}
void dfs(V<vi> &tree, int x, int p, V<bool> &vis, vi &order) {
    vis[x] = 1;
    order.push_back(x);
    for (auto y : tree[x]) {
        if (y == p) continue;
        dfs(tree, y, x, vis, order);
    }
}
vi checkTree(V<vi> &tree, int a, int b, int root) {
    vi siz(tree.size());
    vi par(tree.size());
    computeSiz(tree, root, -1, siz, par);
    F0R(i, tree.size()) {
        if (siz[i] >= a and (tree.size() - siz[i] >= b)) {
            V<bool> typeA(tree.size());
            vi order;
            vi ans(tree.size());
            int amountA = 0, amountB = 0;
            dfs(tree, i, par[i], typeA, order);
            for (auto x : order) {
                if (amountA < a) {
                    amountA++;
                    ans[x] = 1;
                } else
                    ans[x] = 3;
            }
            F0R(j, tree.size()) {
                if (typeA[j]) continue;
                if (amountB < b) {
                    amountB++;
                    ans[j] = 2;
                } else ans[j] = 3;
            }
            if (amountA != a or amountB != b) exit(6);
            return ans;
        }
    }
    return {};
}
V<vi> createG(vi p, vi q, int n) {
    V<vi> g(n);
    F0R(i, p.size()) {
        g[p[i]].push_back(q[i]);
        g[q[i]].push_back(p[i]);
    }
    return g;
}
V<vi> g;
void dfsOrder(int x, V<bool> &vis, vi &p, vi &q) {
    vis[x] = 1;
    for (auto y : g[x]) {
        if (vis[y]) continue;
        p.push_back(x);
        q.push_back(y);
        dfsOrder(y, vis, p, q);
    }
}
int findDiff(int x, int y) {
    if (x == 1 and y == 2) return 3;
    if (x == 2 and y == 3) return 1;
    if (x == 1 and y == 3) return 2;
    exit(2);
}
std::vector<int> find_split(int n, int a, int b, int c, std::vector<int> p, std::vector<int> q) {
    g = createG(p, q, n);
    V<pi> comb = {{a,b}, {b,c}, {c,a}, {b,a}, {c,b}, {a,c}};
    F0R(i, n) {
        V<bool> vis(n);
        vi x, y;
        dfsOrder(i, vis, x,y);
        V<vi> tree = createG(x, y, n);
        for (auto [aSiz,bSiz] : comb) {
            vi ans = checkTree(tree, aSiz, bSiz, i);
            if (!ans.empty()) {
                vi recolor(n);
                map<int, int> to;
                if (a == aSiz) to[1] = 1;
                if (aSiz == b) to[1] = 2;
                if (aSiz == c) to[1] = 3;
                if (bSiz == c) to[2] = 3;
                if (bSiz == b) to[2] = 2;
                if (a == bSiz) to[2] = 1;
                to[3] = findDiff(min(to[1], to[2]), max(to[1], to[2]));
                F0R(i, n)
                    recolor[i] = to[ans[i]];
                return recolor;
            }
        }
    }
    vi emptyAns(n);
    return emptyAns;
}
#if DEBUG
int main() {
    int n, m, a, b, c;
    assert(5 == scanf("%d%d%d%d%d", &n, &m, &a, &b, &c));
    vector<int> p(m), q(m);
    for (int i=0; i<m; i++)
        assert(2 == scanf("%d%d", &p[i], &q[i]));
    fclose(stdin);
    vector<int> result = find_split(n, a, b, c, p, q);
    for (int i=0; i<(int)result.size(); i++)
        printf("%s%d", ((i>0)?" ":""), result[i]);
    printf("\n");
    fclose(stdout);
    return 0;
}
#endif
| # | 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... |