#include <bits/stdc++.h>
#include "meetings.h"
using namespace std;
typedef long long ll;
int p, k;
bool comp(const int &i1, const int &i2){
    if(Query(p, i1, i2) == i1) return true;
    return false;
}
void odpowiedz(int a, int b){
    if(a > b) swap(a, b);
    //cerr << a << " " << b << " ans\n";
    Bridge(a, b);
    return;
}
vector<int> posortuj(int a, vector<int> sciezka, int b){
    p = a;
    k = b;
    sort(sciezka.begin(),sciezka.end(),comp);
    return sciezka;
}
void rozw(vector<int> curr, int root){
    if(curr.size() == 1) { odpowiedz(curr[0], root); return; }
    if(curr.size() == 0) { return; }
    // cerr << root << " r\n";
    // for(auto u : curr){
    //     cerr << u << " ";
    // }
    // cerr << " wierzch\n";
    int los = curr[rand() % curr.size()];
    //cerr << los << " los\n";
    vector<int> nasciezce;
    vector<int> odpowiedzi;
    for(auto u : curr){
        if(u == los){
            odpowiedzi.push_back(-1);
            continue;
        }
        odpowiedzi.push_back(Query(los, u, root));
        if(odpowiedzi.back() == u) nasciezce.push_back(u);
    }
    // for(auto u : nasciezce){
    //     cerr << u << " ";
    // }
    // cerr << " niepos\n";
    if(nasciezce.size() > 0){
        vector<vector<int>> podd;
        vector<int> sor = posortuj(los, nasciezce, root);
        // for(auto u : sor){
        //     cerr << u << " ";
        // }
        // cerr << " pos\n";
        vector<int> v1;
        vector<int> v2;
        odpowiedz(los, sor[0]);
        for(int i = 0; i < sor.size()-1; ++i){
            odpowiedz(sor[i], sor[i+1]);
        }
        odpowiedz(sor.back(), root);
        //cerr << "wej\n";
        map<int,int> ind;
        for(int i = 0; i < sor.size(); ++i){
            ind[sor[i]] = i;
        }
        //cerr << "pon\n";
        podd.resize(nasciezce.size());
        for(int i = 0; i < curr.size(); ++i){
            if(curr[i] == los or odpowiedzi[i] == curr[i]) continue;
            if(odpowiedzi[i] == los) v1.push_back(curr[i]);
            else if(odpowiedzi[i] == root) v2.push_back(curr[i]);
            else podd[ind[odpowiedzi[i]]].push_back(curr[i]);
            //cerr << i << " " << odpowiedzi[i] << " w\n";
        }
        if(v1.size() > 0) rozw(v1, los);
        if(v2.size() > 0)  rozw(v2, root);
        for(int i = 0; i < sor.size(); ++i){
            if(podd[i].size() == 0) continue;
            rozw(podd[i], sor[i]);
        }
        return;
    }
    else{
        odpowiedz(los, root);
        vector<int> v1;
        vector<int> v2;
        for(int i = 0; i < curr.size(); ++i){
            if(curr[i] == los or odpowiedzi[i] == curr[i]) continue;
            if(odpowiedzi[i] == los) v1.push_back(curr[i]);
            else if(odpowiedzi[i] == root) v2.push_back(curr[i]);
        }
        
        if(v1.size() > 0) rozw(v1, los);
        if(v2.size() > 0)  rozw(v2, root);
    }
}
void Solve(int N){
    int n = N;
    vector<int> curr;
    int root = 0;
    for(int i = 1; i < n;  ++i){
        curr.push_back(i);
    }
    rozw(curr, root);
    return;
}
| # | 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... |