#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

#ifdef _MSC_VER
#include <intrin.h>
#include <cassert>

inline int __builtin_clz(unsigned int x)
{
	unsigned long l = 0;
	if (_BitScanReverse(&l, x))
	{
		return 31 - l;
	}
	return 32;
}
#endif 

const int N = 1e6 + 67;
const int LOG = 31;

int l[N], r[N];

//struct DSU
//{
//	int n;
//	int p[N], sz[N];
//	void init(int __n)
//	{
//		n = __n;
//		for (int i = 0; i < n; i++)
//		{
//			p[i] = i;
//			sz[i] = 1;
//			l[i] = i + 1;
//			r[i] = i + 1;
//		}
//	}
//
//	int find(int a)
//	{
//		if (a != p[a])
//			return p[a] = find(p[a]);
//		return p[a];
//	}
//
//	void merge(int a, int b)
//	{
//		a = find(a);
//		b = find(b);
//		assert((a != b));
//		if (sz[a] < sz[b])swap(a, b);
//		p[b] = a;
//		l[a] = min(l[a], l[b]);
//		r[a] = max(r[a], r[b]);
//		l[b] = -1;
//		r[b] = -1;
//		sz[a] += sz[b];
//		sz[b] = 0;
//	}
//};

int a[N];
int nxt[N][LOG];
int lx[N], rx[N];
int val[N];
int valx[N];
int sp[N][LOG];
int n;

void build_sparse()
{
	for (int i = 1; i <= n; i++)
	{
		sp[i][0] = a[i];
	}
	for (int j = 1; j < LOG; j++)
	{
		for (int i = 1; i + (1 << j) - 1 <= n; i++)
		{
			sp[i][j] = sp[i][j - 1] | sp[i + (1 << (j - 1))][j - 1];
		}
	}
}
int qry(int l, int r)
{
	if (l > r)
		return 0;
	int lg = 31 - __builtin_clz(r - l + 1);
	return sp[l][lg] | sp[r - (1 << lg) + 1][lg];
}

void solve()
{
	int k;
	cin >> n >> k;

	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}

	build_sparse();
	int ans = 0;
	int mask = 0;

	for (int i = 3; i >= 0; i--)
	{
		int l = 1, r = 1;
		int new_mask = mask | (1 << i);
		int cnt = 0;
		while (r != n + 1)
		{
			while (r <= n && (qry(l, r) & new_mask) != new_mask)
			{
				r++;
			}
			if (r != n + 1)
			{
				cnt++;
				l = r + 1;
				r = l;
			}
			else
			{
				break;
			}
		}
		if (cnt >= k)
		{
			ans += (1 << i);
			mask |= (1 << i);
		}
	}
	cout << ans << endl;

}

int main()
{
	solve();
	return 0;
}