#include <iostream>
#include <vector>
#include <algorithm>
int deleteProducts(std::vector<int> ids, int m) {
std::vector<std::pair<int, int>> ids_counts;
const auto id_comp = [](auto p1, auto p2) { return p1.first <
p2.first; };
const auto find_element_by_id = [&ids_counts, id_comp](int id) {
return std::lower_bound(ids_counts.begin(), ids_counts.end(),
std::make_pair(id, 0), id_comp);
};
const auto find_or_insert = [&ids_counts, &find_element_by_id,
id_comp](int id, int count) {
auto it = find_element_by_id(id);
if (it == ids_counts.end()) {
it = ids_counts.emplace(ids_counts.end(), id, count);
std::nth_element(ids_counts.begin(), it,
ids_counts.end(), id_comp);
it = find_element_by_id(id);
}
return it;
};
for (auto id: ids) {
const auto it = find_or_insert(id, 0);
++it->second;
}
std::sort(ids_counts.begin(), ids_counts.end(), [](auto p1, auto p2)
{ return p1.second > p2.second; });
for (const auto& id_count : ids_counts) {
std::cout << "id_count " << id_count.first << " " << id_count.second << std::endl;
}
for (auto remaining_removable = m; ids_counts.size() > 0 &&
remaining_removable >= ids_counts.back().second; ) {
remaining_removable -= ids_counts.back().second;
ids_counts.pop_back();
}
return ids_counts.size();
}
int main() {
std::cout << deleteProducts({3, 3, 2, 1}, 2) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKaW50IGRlbGV0ZVByb2R1Y3RzKHN0ZDo6dmVjdG9yPGludD4gaWRzLCBpbnQgbSkgewogc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgaW50Pj4gaWRzX2NvdW50czsKCiBjb25zdCBhdXRvIGlkX2NvbXAgPSBbXShhdXRvIHAxLCBhdXRvIHAyKSB7IHJldHVybiBwMS5maXJzdCA8CnAyLmZpcnN0OyB9OwogY29uc3QgYXV0byBmaW5kX2VsZW1lbnRfYnlfaWQgPSBbJmlkc19jb3VudHMsIGlkX2NvbXBdKGludCBpZCkgewogcmV0dXJuIHN0ZDo6bG93ZXJfYm91bmQoaWRzX2NvdW50cy5iZWdpbigpLCBpZHNfY291bnRzLmVuZCgpLApzdGQ6Om1ha2VfcGFpcihpZCwgMCksIGlkX2NvbXApOwogfTsKIGNvbnN0IGF1dG8gZmluZF9vcl9pbnNlcnQgPSBbJmlkc19jb3VudHMsICZmaW5kX2VsZW1lbnRfYnlfaWQsCmlkX2NvbXBdKGludCBpZCwgaW50IGNvdW50KSB7CiBhdXRvIGl0ID0gZmluZF9lbGVtZW50X2J5X2lkKGlkKTsKIGlmIChpdCA9PSBpZHNfY291bnRzLmVuZCgpKSB7CiBpdCA9IGlkc19jb3VudHMuZW1wbGFjZShpZHNfY291bnRzLmVuZCgpLCBpZCwgY291bnQpOwogc3RkOjpudGhfZWxlbWVudChpZHNfY291bnRzLmJlZ2luKCksIGl0LAppZHNfY291bnRzLmVuZCgpLCBpZF9jb21wKTsKIGl0ID0gZmluZF9lbGVtZW50X2J5X2lkKGlkKTsKIH0KIHJldHVybiBpdDsKIH07CgogZm9yIChhdXRvIGlkOiBpZHMpIHsKIGNvbnN0IGF1dG8gaXQgPSBmaW5kX29yX2luc2VydChpZCwgMCk7CiArK2l0LT5zZWNvbmQ7CiB9Cgogc3RkOjpzb3J0KGlkc19jb3VudHMuYmVnaW4oKSwgaWRzX2NvdW50cy5lbmQoKSwgW10oYXV0byBwMSwgYXV0byBwMikKeyByZXR1cm4gcDEuc2Vjb25kID4gcDIuc2Vjb25kOyB9KTsKCmZvciAoY29uc3QgYXV0byYgaWRfY291bnQgOiBpZHNfY291bnRzKSB7CglzdGQ6OmNvdXQgPDwgImlkX2NvdW50ICIgPDwgaWRfY291bnQuZmlyc3QgPDwgIiAiIDw8IGlkX2NvdW50LnNlY29uZCA8PCBzdGQ6OmVuZGw7Cn0KCiBmb3IgKGF1dG8gcmVtYWluaW5nX3JlbW92YWJsZSA9IG07IGlkc19jb3VudHMuc2l6ZSgpID4gMCAmJgpyZW1haW5pbmdfcmVtb3ZhYmxlID49IGlkc19jb3VudHMuYmFjaygpLnNlY29uZDsgKSB7CiByZW1haW5pbmdfcmVtb3ZhYmxlIC09IGlkc19jb3VudHMuYmFjaygpLnNlY29uZDsKIGlkc19jb3VudHMucG9wX2JhY2soKTsKIH0KCiByZXR1cm4gaWRzX2NvdW50cy5zaXplKCk7Cn0KCmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8IGRlbGV0ZVByb2R1Y3RzKHszLCAzLCAyLCAxfSwgMikgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=