#include #include int sorter(int *a, int *b){ return *b - *a; } long get(int n){ long max = 1; while(n >= max){ max *= 2; } return max / 2; } int main() { long n, k; scanf("%ld %ld", &n, &k); long t[n]; int i; for(i = 0; i < n; i++){ scanf("%ld", t + i); } qsort(t, n, sizeof(long), sorter); if(n == 1){ printf("%ld\n", t[0]); return 0; } long max = get(t[k - 1]); long szurt[n]; long szurtn = 0; for(i = 0; i < n && t[i] > max; i++){ szurt[szurtn++] = (t[i] & ((max * 2) - 1));// - max; } int num = 0; long sum = 0; while(max){ num = 0; for(i = 0; i < szurtn; i++){ if(szurt[i] >= max){ szurt[i] -= max; num++; } } if(num >= k){ sum += max; } if(num == k){ break; } max /= 2; } printf("%ld\n", sum); return 0; } /* 5 2 6 15 9 666 1 8 4 13 30 27 20 11 30 19 10 2 2 512 256 */ /* #include #include int sorter(int *a, int *b){ return *b - *a; } unsigned int get(int n){ unsigned int max = 1; while(n >= max){ max *= 2; } return max / 2; } int main() { int n, k; scanf("%d %d", &n, &k); int t[n]; int i; for(i = 0; i < n; i++){ scanf("%d", t + i); } puts("asd"); qsort(t, n, sizeof(int), sorter); int max = 0; puts("asd"); max = get(t[k - 1]); int szurt[n]; int szurtn = 0; puts("asd"); for(i = 0; i < n && t[i] > max; i++){ szurt[szurtn++] = (t[i] & ((max * 2) - 1));// - max; } puts("asd"); int num = 0; int sum = 0; while(max){ num = 0; for(i = 0; i < szurtn; i++){ if(szurt[i] >= max){ szurt[i] -= max; num++; } } if(num >= k){ sum += max; } if(num == k){ break; } max /= 2; } printf("%d\n", sum); return 0; } */ /* 5 2 6 15 9 666 1 8 4 13 30 27 20 11 30 19 10 2 2 512 256 */