#include "game.h"
int N;
int* components;
int** component_sets;
int* component_sizes;
int** component_pair_connections;
void initialize(int n){
    N = n;
    components = new int[N];
    component_sets = new int*[N];
    component_sizes = new int[N];
    component_pair_connections = new int*[N];
    for(int i = 0; i < N; i++){
        component_sets[i] = new int[N];
        component_pair_connections[i] = new int[N];
        components[i] = i;
        component_sets[i][0] = i;
        component_sizes[i] = 1;
        for(int j = 0; j < N; j++){
            component_pair_connections[i][j] = 0;
        }
    }
}
int hasEdge(int u, int v){
    int component_u = components[u];
    int component_v = components[v];
    int u_size = component_sizes[component_u];
    int v_size = component_sizes[component_v];
    if(component_pair_connections[component_u][component_v] == u_size * v_size - 1){
        component_sizes[component_u] += v_size;
        for(int i = 0; i < v_size; i++){
            component_sets[component_u][i + u_size] = component_sets[component_v][i];
            components[component_sets[component_v][i]] = component_u;
        }
        for(int i = 0; i < N; i++){
            component_pair_connections[component_u][i] += component_pair_connections[component_v][i];
            component_pair_connections[i][component_u] = component_pair_connections[component_u][i];
        }
        return 1;
    }else{
        component_pair_connections[component_u][component_v]++;
        component_pair_connections[component_v][component_u]++;
        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... |