#include<bits/stdc++.h>
using namespace std;
int bor(int a, int b)
{
    int ans=0;
    if(a<b) swap(a, b);
    int i=0, d=1;
    while(a>=d*2)
    {
        d*=2;
        i++;
    }
    for(; i>=0; i--)
    {
        if(a>=d)
        {
            a-=d;
            ans+=d;
            if(b>=d) b-=d;
        }
        else if(b>=d)
        {
            b-=d;
            ans+=d;
            if(a>=d) a-=d;
        }
        d/=2;
    }
    return ans;
}
int band(int a, int b)
{
    int ans=0;
    if(a<b) swap(a, b);
    int i=0, d=1;
    while(a>=d*2)
    {
        d*=2;
        i++;
    }
    for(; i>=0; i--)
    {
        if(a>=d && b>=d)
        {
            a-=d;
            b-=d;
            ans+=d;
        }
        else if(a>=d)
        {
            a-=d;
        }
        else if(b>=d)
        {
            b-=d;
        }
        d/=2;
    }
    return ans;
}
int n, k;
int x[1000007];
bool used[1000007];
int maxi=0;
void rek(int br, int brtrue)
{
    if(br==0)
    {
        if(brtrue!=k-1)
        {
            return;
        }
        vector<int> ans;
        ans.push_back(x[0]);
        for(int i=1; i<n; i++)
        {
            if(used[i]==false)
            {
                ans[ans.size()-1]=bor(ans[ans.size()-1], x[i]);
            }
            else
            {
                ans.push_back(x[i]);
            }
        }
        int w=ans[0];
        for(int i=1; i<ans.size(); i++)
        {
            w=band(w, ans[i]);
        }
        maxi=max(maxi, w);
        return;
    }
    for(int i=0; i<=1; i++)
    {
        used[n-br]=i;
        if(i==1) brtrue++;
        rek(br-1, brtrue);
        if(i==1) brtrue--;
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k;
    for(int i=0; i<n; i++)
    {
        cin>>x[i];
    }
    rek(n-1, 0);
    cout<<maxi<<'\n';
    return 0;
}
