#include <bits/stdc++.h>
#include "simurgh.h"
using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 1000'007;
int fau[N];
int clr[N];
pair<int, int> e[N];
int vis[N];
vector<pair<int, int>> ed[N], ed2[N];
vector<int> drz; int ildrz = 0;
int o[N], oe[N], wys[N];
int Find(int v)
{
    if(fau[v] == v) return v;
    return (fau[v] = Find(fau[v]));
}
void Union(int a, int b)
{
    fau[Find(b)] = Find(a);
}
void DFSD(int v)
{
    for(int i = 0; i < (int)ed[v].size(); ++i)
    {
        if(wys[ed[v][i].st] != 0) continue;
        o[ed[v][i].st] = v; oe[ed[v][i].st] = ed[v][i].nd;
        wys[ed[v][i].st] = wys[v] + 1;
        drz.pb(ed[v][i].nd);
        ed2[v].pb(ed[v][i]);
        ed2[ed[v][i].st].pb(make_pair(v, ed[v][i].st));
        DFSD(ed[v][i].st);
    }
}
int DoDQ(int ol, int nw)
{
    vector<int> q;
    q = drz;
    for(int i = 0; i < (int)drz.size(); ++i)
        if(q[i] == ol) q[i] = nw;
    return count_common_roads(q) - ildrz;
}
void DFS(int v)
{
    //cerr << v << "\n";
    for(int i = 0; i < (int)ed2[v].size(); ++i)
    {
        if(o[v] == ed2[v][i].st) continue;
        DFS(ed2[v][i].st);
    }
    if(v == 0) return;
    pair<int, int> bst = make_pair(N, N);
    for(int i = 0; i < (int)ed[v].size(); ++i)
        if(ed[v][i].nd != oe[v])
            bst = min(bst, make_pair(wys[ed[v][i].st], ed[v][i].nd));
    if(bst.st >= wys[v])
    {
        if(clr[oe[v]] == 0)
            clr[oe[v]] = 1;
        return;
    }
    vector<int> pth, qu;
    int x = v;
    while(wys[x] != bst.st)
    {
        pth.pb(oe[x]);
        x = o[x];
    }
    for(int i = 0; i < (int)pth.size(); ++i)
    {
        int cur = 0;
        if(clr[pth[i]] == 0)
        {
            cur = DoDQ(pth[i], bst.nd);
            if(cur == 1)
                {clr[pth[i]] = -1; clr[bst.nd] = 1;}
            if(cur == -1)
                {clr[pth[i]] = 1; clr[bst.nd] = -1;}
            if(cur == 0)
                if(clr[bst.nd] != 0)
                    clr[pth[i]] = clr[bst.nd];
        }else
        {
            if(clr[bst.nd] == 0)
            {
                cur = DoDQ(pth[i], bst.nd);
                if(cur == 0)
                    clr[bst.nd] = clr[pth[i]];
                else
                    clr[bst.nd] = clr[pth[i]] * -1;
            }
        }
        qu.pb(cur);
    }
    if(clr[bst.nd] == 0)
        clr[bst.nd] = -1;
    for(int i = 0; i < (int)pth.size(); ++i)
    {
        if(clr[pth[i]] != 0) continue;
        if(qu[i] == 0)
            clr[pth[i]] = clr[bst.nd];
        else
            clr[pth[i]] = clr[bst.nd] * -1;
    }
}
int Fill(vector<int> &akt)
{
    int s = 0;
    for(int i = 0; i < (int)drz.size(); ++i)
    {
        if(Find(e[drz[i]].st) != Find(e[drz[i]].nd))
        {
            Union(e[drz[i]].st, e[drz[i]].nd);
            if(clr[drz[i]] == 1)
                ++s;
            akt.pb(drz[i]);
        }
    }
    return s;
}
int Ilt(vector<int> &q)
{
    int d = Fill(q);
    return count_common_roads(q) - d;
}
int DoS(int n, int m)
{
    //cerr << "DoS:\n";
    vector<int> cur, qu;
    for(int i = 0; i < n; ++i) fau[i] = i;
    for(int i = 0; i < m; ++i)
    {
        if(clr[i] != 0 || vis[i]) continue;
        if(Find(e[i].st) != Find(e[i].nd))
        {
            //cerr << i << "\n";
            cur.pb(i);
            vis[i] = 1;
            Union(e[i].st, e[i].nd);
        }
    }
    if((int)cur.size() == 0) return -1;
    qu = cur;
    int ilw = Ilt(qu);
    
    //cerr << ilw << "\n";
    
    for(int xd = 1; xd <= ilw; ++xd)
    {
        int p = 0, k = (int)cur.size() - 1, s;
        while(p < k)
        {
            qu.clear();
            s = (p + k) / 2;
            for(int i = 0; i < n; ++i) fau[i] = i;
            for(int i = 0; i <= s; ++i)
            {
                qu.pb(cur[i]);
                Union(e[cur[i]].st, e[cur[i]].nd);
            }
            if(Ilt(qu) == 0)
                p = s + 1;
            else
                k = s;
        }
        clr[cur[p]] = 1;
        swap(cur[p], cur.back());
        cur.pop_back();
    }
    return 1;
}
vector<int> find_roads(int _n, vector<int> _u, vector<int> _v)
{
    int n = _n, m = (int)_u.size();
    for(int i = 0; i <= n; ++i) fau[i] = i;
    for(int i = 0; i < m; ++i)
    {
        e[i] = make_pair(_u[i], _v[i]);
        ed[_u[i]].pb(make_pair(_v[i], i));
        ed[_v[i]].pb(make_pair(_u[i], i));
    }
    wys[0] = 1;
    DFSD(0);
    ildrz = count_common_roads(drz);
    DFS(0);
    /*for(int i = 0; i < m; ++i)
        cerr << "E: " << i << " " << clr[i] << "\n";
    for(int i = 1; i < n; ++i)
        cerr << "UE: " << i << " " << o[i] << " " << clr[oe[i]] << "\n";*/
    int v = DoS(n, m);
    while(v != -1)
        v = DoS(n, m);
    vector<int> answer;
    for(int i = 0; i < m; ++i)
        if(clr[i] == 1)
            answer.pb(i);
    return answer;
}
| # | 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... |