#include "insects.h"
#include <vector>
#include <algorithm>
#include <cassert>
#include <random>
#include <iostream>
std::mt19937 rng(12354);
#define debug(x) #x << " = " << x << '\n'
int min_cardinality(int n) {
  std::vector<int> reprezentant;
  std::vector<int> order(n);
  for (int i = 0; i < n; i++) {
    order[i] = i;
  }
  std::shuffle(order.begin(), order.end(), rng);
  for (int i : order) {
    move_inside(i);
    if (press_button() >= 2) {
      move_outside(i);
    } else {
      reprezentant.push_back(i);
    }
  }
  for (int i : reprezentant) {
    move_outside(i);
  }
  std::vector<bool> taken(n, false);
  int D = (int) reprezentant.size();
  if (D > n / 2) {
    return 1;
  }
  if (D == 1) {
    return n;
  }
  
  if (D >= 32) { // caut binar ts
    auto check = [&](int mid) {
      std::vector<int> inside;
      for (int i : order) {
        move_inside(i);
        inside.push_back(i);
        if (press_button() > mid) {
          move_outside(i);
          inside.pop_back();
        }
        if ((int) inside.size() == D * mid) {
          break;
        }
      }
      int sz = (int) inside.size();
      for (int i : inside) {
        move_outside(i);
      }
      if (sz == D * mid) {
        return true;
      } else {
        return false;
      }
    };
    int l = 2, r = n / D, ret = 1;
    while (l <= r) {
      int mid = (l + r) / 2;
      if (check(mid)) {
        ret = mid;
        l = mid + 1;
      } else {
        r = mid - 1;
      }
    }
    return ret;
  } else {
    std::vector<int> where(n, 0);
    for (int i : reprezentant) {
      where[i] = -1;
    }
    for (int bit = 0; bit <= std::__lg(D - 1); bit++) {
      for (int i = 0; i < D; i++) {
        if (i >> bit & 1) {
          move_inside(reprezentant[i]);
        }
      }
      for (int i = 0; i < n; i++) {
        if (where[i] != -1) {
          move_inside(i);
          if (press_button() == 2) {
            where[i] |= 1 << bit;
          }
          move_outside(i);
        }
      } 
      for (int i = 0; i < D; i++) {
        if (i >> bit & 1) {
          move_outside(reprezentant[i]);
        }
      }
    }
    std::vector<int> f(D, 1);
    for (int i = 0; i < n; i++) {
      if (where[i] != -1) {
        f[where[i]]++;
      }
    }
    return *std::min_element(f.begin(), f.end());
  }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |