#include<iostream>
#include<unordered_set>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
/*void debug(multiset<unsigned long long> s){
	for(const auto &it : s){
		cout<<it<<" ";
	}
	cout<<endl;
}*/
unsigned long long t[31];
int main(){
	unsigned long long n,k;
	cin>>n>>k;
	unordered_map<unsigned long long,unordered_multiset<unsigned long long>> m;
	unsigned long long h=1;
	for(int i=0;i<31;i++){
		t[i]=h;
		unordered_multiset<unsigned long long> s;
		m[h]=s;
		h*=2;
	}
	for(unsigned long long i=0;i<n;i++){
		unsigned long long j;
		cin>>j;
		for(int ii=0;ii<31;ii++){
			if(t[ii]&j){
				m[t[ii]].insert(j);
			}
		}
	}
	unordered_multiset<unsigned long long> res;
	int pos=-1;
	unsigned long long gg=0;
	for(int i=30;i>=0;i--){
		if(m[t[i]].size()>=k){
			res=m[t[i]];
			pos=i;
			gg=t[i];
			break;
		}
	}
	if(pos==-1){
		cout<<"0"<<endl;
		return 0;
	}
	vector<unsigned long long> temp;
	temp.reserve(10000);
	unordered_multiset<unsigned long long> oo;
	for(int i=pos-1;i>=0;i--){
		temp.clear();
		oo.clear();
		set_intersection(res.begin(),res.end(),m[t[i]].begin(),m[t[i]].end(),back_inserter(temp));
		oo=unordered_multiset<unsigned long long>(temp.begin(),temp.end());
		if(temp.size()>=k){
			res=oo;
			gg+=t[i];
		}
	}
	cout<<gg<<endl;
	return 0;

}

