#include "insects.h"
#include <bits/stdc++.h>
using namespace std;
int n;
vector<bool> ins;
vector<int> cnt, cands;
int types;
void rem(int i) {
if (ins[i]) move_outside(i);
ins[i] = false;
}
void add(int i) {
if (!ins[i]) move_inside(i);
ins[i] = true;
}
void dbg(vector<int> a) {
cout << "DBG: ";
for (auto x: a) cout << x << " ";
cout << "\n";
}
void dnc(int l, int r, vector<int> curr) {
if (curr.empty() || l > r) return;
if (l == r) {
cnt[l] += curr.size();
return;
}
int mid = (l + r) / 2;
for (int i = mid+1; i <= r; i++) {
rem(cands[i]);
}
vector<int> inA, inB;
for (auto x: curr) {
add(x);
if (press_button() > 1) {
inA.push_back(x);
}
else {
inB.push_back(x);
}
rem(x);
}
for (int i = mid+1; i <= r; i++) {
add(cands[i]);
}
dnc(l, mid, inA);
dnc(mid+1, r, inB);
}
int min_cardinality(int N) {
n = N;
ins.assign(n, false);
vector<bool> ok(n, false);
types = 0;
int haveIn = 0;
for (int i = 0; i < n; i++) {
add(i);
int x = press_button();
if (x > 1) {
rem(i);
}
else {
types++;
cands.push_back(i);
ok[i] = true;
haveIn++;
}
}
if (types == 1) {
return n;
}
int lo = 2, hi = n / types;
int fin = 1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
vector<int> added;
for (int i = 0; i < n; i++) {
if (ins[i]) continue;
add(i);
haveIn++;
if (press_button() > mid) {
rem(i);
haveIn--;
}
else {
added.push_back(i);
}
}
if (haveIn < types * mid) {
hi = mid-1;
for (int i = 0; i < n; i++) {
if (!ins[i]) {
haveIn++;
add(i);
}
}
for (auto x: added) {
rem(x);
haveIn--;
}
}
else {
fin = mid;
lo = mid+1;
}
}
return fin;
}