Submission #1220437

#TimeUsernameProblemLanguageResultExecution timeMemory
1220437LucaIliePipes (CEOI15_pipes)C++20
100 / 100
596 ms9192 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 1e5;
const int MAX_LOG_N = 16;
mt19937 rnd(1001);
int n;
int sef[MAX_N + 1], parent[MAX_LOG_N + 1][MAX_N + 1];
bool vis[MAX_N + 1];
vector<int> vert[MAX_N + 1];
int depth[MAX_N + 1];
int sp[MAX_N + 1];
vector<int> adj[MAX_N + 1];

int findSef(int v) {
    if (sef[v] != v)
        sef[v] = findSef(sef[v]);
    return sef[v];
}

bool connect(int u, int v) {
    int x = findSef(u);
    int y = findSef(v);
    if (x == y)
        return true;

    sef[y] = x;
    adj[u].push_back(v);
    adj[v].push_back(u);

    return false;
}

int lca(int u, int v) {
    if (depth[u] > depth[v]) 
        swap(u, v);

    for (int l = log2(n); l >= 0; l--) {
        if (depth[v] - (1 << l) >= depth[u]) 
            v = parent[l][v];
    }

    if (u == v)
        return u;

    for (int l = log2(n); l >= 0; l--) {
        if (parent[l][u] != parent[l][v]) {
            u = parent[l][u];
            v = parent[l][v];
        }
    }

    return parent[0][u];
}

void dfs(int u, int p) {
    vis[u] = true;
    for (int v: adj[u]) {
        if (v == p)
            continue;
        dfs(v, u);
        sp[u] ^= sp[v];
    }
    if (p != 0 && sp[u] == 0)
        cout << u << " " << p << "\n";
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int m;

    cin >> n >> m;
    for (int v = 1; v <= n; v++)
        sef[v] = v;
    for (int e = 0; e < m; e++) {
        int u, v;

        cin >> u >> v;
        if (connect(u, v)) {
            int f = rnd();
            sp[u] ^= f;
            sp[v] ^= f;
        }
    }
    

    for (int v = 1; v <= n; v++) {
        if (vis[v])
            continue;
        dfs(v, 0);
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...