#include "highway.h"
#include <iostream>
#define fi first
#define se second
#define ll long long
using namespace std;
// progression
// solve sub2, sub4 then try sub6
vector<int> dist, parEdge;
vector<vector<pair<int, int>>> adj;
void dfs(int u, int d, int par = -1){
dist[u] = d;
for (pair<int, int> pa: adj[u]){
int v = pa.fi;
if (v == par) continue;
parEdge[v] = pa.se;
dfs(v, d+1, u);
}
}
void sub2(int n, vector<int> u, vector<int> v, int a, int b, int s){
// s is one end
// dfs around s
dfs(s, 0);
int m = u.size();
vector<int> w(m);
for (int i = 0; i < m; i++){
w[i] = 0;
}
long long val = ask(w);
long long len = val / (long long)a;
cout << len << endl;
vector<int> cand;
for (int i = 0; i < n; i++){
if (dist[i] == len){
cand.push_back(i);
cout << i << ' ';
}
}
cout << endl;
// binary search for t
int l = 0, r = cand.size()-1;
while(l < r){
cout << l << ' ' << r << endl;
int mid = (l + r)/2;
// for l to mid, check if increase or not
for (int i = 0; i < m; i++){
w[i] = 0;
}
for (int i = l; i <= mid; i++){
w[parEdge[cand[i]]] = 1;
}
long long chck = ask(w);
if (chck > val){
// move to r
r = mid;
cout << "move r to " << mid << endl;
}
else{
l = mid+1;
cout << "move l to " << mid+1 << endl;
}
}
// ans at r
answer(s, cand[r]);
}
void find_pair(int n, vector<int> u, vector<int> v, int a, int b) {
int m = u.size();
dist.assign(n, 0);
parEdge.assign(n, 0);
adj.assign(n, vector<pair<int, int>>());
for (int i = 0; i < m; i++){
adj[u[i]].push_back({v[i], i});
adj[v[i]].push_back({u[i], i});
}
sub2(n, u, v, a, b, 0);
}