intgetcnt(){ int cnt = 0; for (int i = 1; i <= n; ++i) { add(i), in[i] = 0; if (qry() > 1) del(i), in[i] = 1; else ++cnt; } return cnt; }
intmin_cardinality(int N){ n = N, cnt = 0; int c = getcnt(), L = 1, R = n / c; while (L < R) { assert(cnt == L * c); int mid = (L + R) >> 1; if (R - L >= 5) --mid; std::vector<int> tmp1, tmp2; for (int i = 1; i <= n; ++i) { if (in[i]) { add(i); if (qry() > mid + 1) del(i), tmp1.emplace_back(i); else tmp2.emplace_back(i); } if (cnt == c * (mid + 1)) break; } if (cnt == c * (mid + 1)) { L = mid + 1; for (auto x : tmp2) in[x] = 0; } else { R = mid; for (auto x : tmp1) in[x] = 0; for (auto x : tmp2) del(x); } } return L; }