#include "island.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
//#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e9;
struct DSU {
  vi dad;
  DSU (int nn) {
    dad.resize(nn+1);
    iota(all(dad),0ll);
  }
  int find(int x) {
    if (x == dad[x]) return x;
    return dad[x] = find(dad[x]);
  }
  void unite(int x,int y) {
    dad[find(x)] = find(y);
  }
};
map<pii,int> sor;
int sorgu(int x,int k) {
  if (sor.count({x,k})) return sor[{x,k}];
  return sor[{x,k}] = query(x,k);
}
void solve(int N, int L) {
  vi active(N+1,1),deg(N+1,0);
  int ctr = 0;
  DSU dsu(N);
  while (ctr < N-1) {
    vi merged(N+1,0);
    for (int i = 1;i<=N && ctr < N-1;i++) {
      if (!active[i]) continue;
      int j = sorgu(i,deg[i]+1);
      if (dsu.find(i) == dsu.find(j)) {
        active[i] = 0;
        continue;
      }
      if (!active[j]) {
        active[i] = 0;
        continue;
      }
      if (j <= i && merged[j] == i) {
        answer(i,j);
        deg[i]++,deg[j]++;
        ctr++;
        dsu.unite(i,j);
      }
      merged[i] = j;
    }
  }
}
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |