#include "simurgh.h"
#include <bits/stdc++.h>
#define maxn 505
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
int nho[maxn][maxn];
vector<int> find_roads(int n, vector<int> u, vector<int> v) {
    int m = u.size();
    vector<int> cl(m, 0);
    for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) nho[i][j] = -1;
    for (int i = 0; i < m; i++)
        nho[u[i]][v[i]] = nho[v[i]][u[i]] = i;
    for (int o = 0; o < n; o++) {
        vector<int> indx, suk;
        vector<int> par(n);
        iota(par.begin(), par.end(), 0);
        function<int(int)> find_set = [&](int v) {
            return par[v] == v ? v : par[v] = find_set(par[v]);
        };
        for (int i = 0; i < m; i++)
        if (u[i] != o && v[i] != o && find_set(u[i]) != find_set(v[i])) {
            par[find_set(u[i])] = find_set(v[i]);
            indx.emplace_back(i);
        }
        for (int i = 0; i < n; i++)
        if (o != i) suk.emplace_back(find_set(i));
        sort(suk.begin(), suk.end());
        suk.erase(unique(suk.begin(), suk.end()), suk.end());
        for (int _i = 0; _i < suk.size(); _i++) {
            vector<int> indice = indx;
            for (int i = 0; i < suk.size(); i++)
            if (i != _i)
                for (int j = 0; j < n; j++) if (j != o && find_set(j) == suk[i]) {indice.emplace_back(j); break;}
            vector<int> ADJ;
            for (int i = 0; i < n; i++)
                if (find_set(i) == suk[_i]) if (nho[o][i] != -1) ADJ.emplace_back(nho[o][i]);
            vector<ii> zoe;
            int cnt = -1, cc = -1;
            for (int i : ADJ) {
                if (cl[i] == 1) {
                    cnt = i;
                    continue;
                }
                if (cl[i] == -1) {
                    cc = i;
                    continue;
                }
                indice.emplace_back(i);
                zoe.emplace_back(i, count_common_roads(indice));
                indice.pop_back();
            }
            int mx = 0, dif = 0;
            for (auto [u, v] : zoe) mx = max(mx, v);
            for (auto [u, v] : zoe)
                if (mx != v) {
                    dif = 1;
                    break;
                }
            if (dif) {
                for (auto [u, v] : zoe) {
                    if (v == mx) cl[u] = 1;
                    else cl[u] = -1;
                }
                continue;
            }
            if (cnt == -1 && cc == -1) {
                for (auto [u, v] : zoe) cl[u] = 1;
                continue;
            }
            if (cnt != -1) {
                indice.emplace_back(cnt);
                int T = count_common_roads(indice);
                for (auto [u, v] : zoe) {
                    if (v == T) cl[u] = 1;
                    else cl[u] = -1;
                }
                continue;
            }
            indice.emplace_back(cc);
            int T = count_common_roads(indice);
            for (auto [u, v] : zoe) {
                if (v != T) cl[u] = 1;
                else cl[u] = -1;
            }
        }
    }
    vector<int> ans;
    for (int i = 0; i < m; i++) if (cl[i] == 1) ans.emplace_back(i);
    return ans;
}
/*
5 5
0 1
0 2
0 3
0 4
1 4
0 1 2 3
*/
| # | 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... |