#include <bits/stdc++.h>
using namespace std;
vector<int> r;
vector<int> p;
unordered_map<int,unordered_map<int,int>> M;
vector<int> elementos;
int n;
void init(int n){
    r.assign(n,0);
    for(int i=0;i<n;i++){
        p.push_back(i);
    }
    elementos.assign(n,1);
}
int encontrar(int x){
    if(p[x]!=x){
        p[x]=encontrar(p[x]);
    }
    return p[x];
}
void unir(int x,int y){
    int r_x,r_y;
    r_x=encontrar(x);
    r_y=encontrar(y);
    if(r[r_x]>r[r_y]){
        r[r_x]+=r[r_y];
        p[r_y]=r_x;
    }else{
        r[r_y]+=r[r_x];
        p[r_x]=r_y;
    }
}
void initialize(int N){
    n=N;
    init(n);
}
int hasEdge(int u, int v){
    int capital1,capital2,capitalganadora;
    capital1=encontrar(u);
    capital2=encontrar(v);
    if(M[capital1][capital2]==elementos[capital1]*elementos[capital2]-1){
        unir(u,v);
        capitalganadora=encontrar(u);
        if(capital1==capitalganadora){
            elementos[capital1]+=elementos[capital2];
            for(auto x:M[capital2]){
                M[capital1][x.first]+=x.second;
                M[x.first][capital1]=M[capital1][x.first];
            }
        }else{
            elementos[capital2]+=elementos[capital1];
            for(auto x:M[capital1]){
                M[capital2][x.first]+=x.second;
                M[x.first][capital2]=M[capital2][x.first];
            }
        }
        return 1;
    }else{
        M[capital1][capital2]++;
        return 0;
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |