#include "meetings.h"
#include<bits/stdc++.h>
using namespace std;
#define query Query
#define answer Bridge
#define pb push_back
const int lim=2100;
unordered_set<int>v[lim];
vector<int>ch;
int dfs(int node,int par,int targ){
  if(node==targ){
    ch.clear();
    ch.pb(node);
    return 1;
  }
  for(int j:v[node]){
    if(j==par)continue;
    if(dfs(j,node,targ)){
      ch.pb(node);
      return 1;
    }
  }
  return 0;
}
int vis[lim],gonna[lim];
void killall(int node,int par,int targ){
  if(node==targ)return;
  gonna[node]=0;
  for(int j:v[node]){
    if(j==par)continue;
    killall(j,node,targ);
  }
}
int tot;
int sz[lim];
int sbs(int node,int par){
  sz[node]=1;
  for(int j:v[node]){
    if(!vis[j]||!gonna[j]||j==par)continue;
    sz[node]+=sbs(j,node);
  }
  return sz[node];
}
int findcen(int node,int par){
  for(int j:v[node]){
    if(!vis[j]||!gonna[j]||j==par)continue;
    if(tot<2*sz[j])return findcen(j,node);
  } 
  return node;
}
int findleaf(int node,int par){
  for(int j:v[node]){
    if(!vis[j]||!gonna[j]||j==par)continue;
    return findleaf(j,node);
  }
  return node;
}
void Solve(int n){
  v[0].insert(1);
  v[1].insert(0);
  vis[0]=vis[1]=1;
  for(int i=2;i<n;i++){
    if(vis[i])continue;
    for(int j=0;j<n;j++)gonna[j]=1;
    while(!vis[i]){
      int cnt=0,dude=0;
      for(int j=0;j<n;j++){
        if(vis[j]&&gonna[j]){
          cnt++;
          dude=j;
        }
      }
      if(cnt==1){
        vis[i]=1;
        v[i].insert(dude);
        v[dude].insert(i);
        break;
      }
      vector<int>leafs;
      if(cnt==2){
        leafs.pb(dude);
        for(int j:v[dude]){
          if(vis[j]&&gonna[j])leafs.pb(j);
        }
      }else{
        tot=sbs(dude,-1);
        dude=findcen(dude,-1);
        for(int j:v[dude]){
          if(vis[j]&&gonna[j]){
            leafs.pb(findleaf(j,dude));
            if(leafs.size()==2)break;
          }
        }
      }
      int res=query(leafs[0],leafs[1],i);
      if(!vis[res]){
        dfs(leafs[0],-1,leafs[1]);
        int l=1,r=ch.size()-2,ans=ch.size()-1;
        while(l<=r){
          int mid=l+r>>1;
          int cur=query(ch[mid],ch.back(),res);
          if(cur==res){
            l=mid+1;
          }else{
            ans=mid;
            r=mid-1;
          }
        }
        v[ch[ans]].erase(ch[ans-1]);
        v[ch[ans-1]].erase(ch[ans]);
        v[ch[ans]].insert(res);
        v[res].insert(ch[ans]);
        v[ch[ans-1]].insert(res);
        v[res].insert(ch[ans-1]);
        vis[res]=1;
      }
      killall(leafs[0],-1,res);
      killall(leafs[1],-1,res);
      gonna[res]=1;
    }
  }
  for(int i=0;i<n;i++){
    for(int j:v[i]){
      if(i<j){
        answer(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... |