#include #include #include inline bool isNthBitOne(unsigned x, unsigned n) { return (x >> n) % 2 == 1; } int main() { const unsigned listArraySize = 30; std::multiset bits[listArraySize]; std::list temp; unsigned n, k, musician, m, w, count; int i, j; scanf("%d %d", &n, &k); for(i = 0; i < n; ++i) { scanf("%d", &musician); w = 0; m = musician; while(musician > 0) { if(musician % 2 == 1) { bits[w].insert(m); } musician /= 2; ++w; } } bool success = false; for(i = listArraySize - 1; i >=0; --i) { if(bits[i].size() >= k) { break; } } for(j = i - 1; j >= 0 && bits[i].size() > k; --j) { count = 0; for(unsigned x : bits[i]) { if(isNthBitOne(x, j)) { ++count; } else { temp.push_back(x); } } if(bits[i].size() > k && count >= k) { for(unsigned x : temp) { bits[i].erase(x); if(bits[i].size() == k) { break; } } } temp.clear(); } unsigned res = *bits[i].begin(); for(unsigned x : bits[i]) { res &= x; } printf("%u\n", res); return 0; }