#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
const int MAX = 110;
int n;
int parent[MAX];
int depth[MAX];
vector <int> v[MAX];
vector <int> groups;
//int query(int size_a, int size_b, int a[], int b[]) {
//    return 1;
//}
//void setRoad(int a, int b) {
//}
int find(int a) {
    if (a == parent[a]) return a;
    return parent[a] = find(parent[a]);
}
void spoji(int a, int b) {
    setRoad(a, b);
    a = find(a);
    b = find(b);
    if (a == b) return;
    if (depth[a] >= depth[b]) {
        depth[a] += depth[b];
        parent[b] = a;
        for (auto e : v[b]) v[a].push_back(e);
    }
    else {
        depth[b] += depth[a];
        parent[a] = b;
        for (auto e : v[a]) v[b].push_back(e);
    }
}
int sendQuery(vector <int> a, vector <int> b) {
    if (a.empty()) return 0;
    if (b.empty()) return 0;
    int sza = a.size();
    int szb = b.size();
    int arra[sza];
    int arrb[szb];
    for (int i = 0; i < sza; i++) arra[i] = a[i];
    for (int i = 0; i < szb; i++) arrb[i] = b[i];
    return query(sza, szb, arra, arrb);
}
void rek(vector <int> g, vector <int> g2, int o);
void nadiUnutarGrupe(int g, int g2) {
    vector <int> a, b;
    for (int i = 1; i <= n; i++) {
        if (find(i) == g) a.push_back(i);
        if (find(i) == g2) b.push_back(i);
    }
    rek(a, b, 2);
}
void rek(vector <int> g, vector <int> g2, int o) {
    if (g.size() == 1 && g2.size() == 1) {
        if (o == 1) nadiUnutarGrupe(g[0], g2[0]);
        else spoji(g[0], g2[0]);
        return;
    }
    vector <int> gpola, gpola2, g2pola, g2pola2;
    for (int i = 0; i < (int)g.size(); i++) {
        if (i < g.size() / 2) gpola.push_back(g[i]);
        else gpola2.push_back(g[i]);
    }
    for (int i = 0; i < (int)g2.size(); i++) {
        if (i < g2.size() / 2) g2pola.push_back(g2[i]);
        else g2pola2.push_back(g2[i]);
    }
    if (sendQuery(gpola, g2)) {
        if (sendQuery(gpola, g2pola)) rek(gpola, g2pola, o);
        else rek(gpola, g2pola2, o);
    }
    else {
        if (sendQuery(gpola2, g2pola)) rek(gpola2, g2pola, o);
        else rek(g2pola, g2pola2, o);
    }
}
void solve() {
    vector <int> g, g2;
    int bit = 0;
    while (true) {
        g.clear(), g2.clear();
        for (int i = 0; i < (int)g.size(); i++) {
            if (i & (1 << bit)) g.push_back(groups[i]);
            else g2.push_back(groups[i]);
        }
        if (sendQuery(g, g2)) break;
        bit++;
    }
    rek(g, g2, 1);
}
void run(int N) {
    n = N;
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
        depth[i] = 1;
        v[i].push_back(i);
    }
    for (int i = 1; i < n; i++) {
        groups.clear();
        for (int j = 1; j <= n; j++) if (find(j) == j) groups.push_back(j);
        solve();
    }
}
//int main() {
//}
| # | 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... |