Problem:
Score : 400 points

Problem Statement

One day, Niwango-kun, an employee of Dwango Co., Ltd., found an integer sequence (a_1, ..., a_N) of length N.
He is interested in properties of the sequence a.

For a nonempty contiguous subsequence a_l, ..., a_r (1 \leq l \leq r \leq N) of the sequence a, its beauty is defined as a_l + ... + a_r. Niwango-kun wants to know the maximum possible value of the bitwise AND of the beauties of K nonempty contiguous subsequences among all N(N+1)/2 nonempty contiguous subsequences. (Subsequences may share elements.)

Find the maximum possible value for him.

Constraints

2 \leq N \leq 1000

1 \leq a_i \leq 10^9

1 \leq K \leq N(N+1)/2

All numbers given in input are integers

Input

Input is given from Standard Input in the following format:

N K
a_1 a_2 ... a_N

Output

Print the answer.

Sample Input 1

4 2
2 5 2 5

Sample Output 1

12

There are 10 nonempty contiguous subsequences of a. Let us enumerate them:

contiguous subsequences starting from the first element: \{2\}, \{2, 5\}, \{2, 5, 2\}, \{2, 5, 2, 5\}

contiguous subsequences starting from the second element: \{5\}, \{5, 2\}, \{5, 2, 5\}

contiguous subsequences starting from the third element: \{2\}, \{2, 5\}

contiguous subsequences starting from the fourth element: \{5\}

(Note that even if the elements of subsequences are equal, subsequences that have different starting indices are considered to be different.)

The maximum possible bitwise AND of the beauties of two different contiguous subsequences is 12.
This can be achieved by choosing \{5, 2, 5\} (with beauty 12) and \{2, 5, 2, 5\} (with beauty 14).

Sample Input 2

8 4
9 1 8 2 7 5 6 4

Sample Output 2

32

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()

typedef long long ll;
typedef long double ld;
typedef unsigned int uint;
typedef unsigned long long ull;

constexpr const int INT_INF=0x3f3f3f3f; // 1061109567
constexpr const ll LL_INF=0x3f3f3f3f3f3f3f3f; // 4557430888798830399
constexpr const double D_INF=numeric_limits<double>::infinity();
constexpr const ld LD_INF=numeric_limits<ld>::infinity();
constexpr const double EPS=1e-9;

template<typename T>constexpr bool flt(const T&x,const T&y){return x<y-EPS;}
template<typename T>constexpr bool fgt(const T&x,const T&y){return x>y+EPS;}
template<typename T>constexpr bool feq(const T&x,const T&y){return abs(x-y)<=EPS;}
template<typename T>constexpr bool in(const T&v,const T&lo,const T&hi){return!(v<lo||hi<v);}
template<typename T>constexpr const T&_min(const T&x,const T&y){return x<y?x:y;}
template<typename T>constexpr const T&_max(const T&x,const T&y){return x<y?y:x;}
template<typename T,typename...Ts>constexpr const T&_min(const T&x,const Ts&...xs){return _min(x,_min(xs...));}
template<typename T,typename...Ts>constexpr const T&_max(const T&x,const Ts&...xs){return _max(x,_max(xs...));}
template<typename T,typename...Ts>void MIN(T&x,const Ts&...xs){x=_min(x,xs...);}
template<typename T,typename...Ts>void MAX(T&x,const Ts&...xs){x=_max(x,xs...);}
template<typename T>constexpr const T&_clamp(const T&v,const T&lo,const T&hi){return v<lo?lo:hi<v?hi:v;}
template<typename T>void CLAMP(T&v,const T&lo,const T&hi){v=_clamp(v,lo,hi);}
template<typename T,typename...Args>unique_ptr<T>_make_unique(Args&&...args){return unique_ptr<T>(new T(forward<Args>(args)...));}
template<typename T,typename...Args>shared_ptr<T>_make_shared(Args&&...args){return shared_ptr<T>(new T(forward<Args>(args)...));}
#define min(...) _min(__VA_ARGS__)
#define max(...) _max(__VA_ARGS__)
#define clamp(...) _clamp(__VA_ARGS__)
#define make_unique _make_unique
#define make_shared _make_shared

// MOD
#define add(a, b) ((a % MOD) + (b % MOD)) % MOD
#define mul(a, b) ((a % MOD) * (b % MOD)) % MOD
#define sub(a, b) ((a % MOD) + MOD - (b % MOD)) % MOD
const ll MOD = 1000000000 + 7;

//
//
//  　　┓　　　┏
//  　＊┗┓　┏┛
//  　　　┫　┣　＊
//  　┏┳┻━┻┳┓
//  　┗┫　　　┣┛
//  ＊　┣　　━┃　＊        Merry Christmas!!
//  　┏┛　　〃┃
//  　┃●　　　┣━┳┓
//  　┗┻┳━━┛　┣┛
//  　＊　┃┏┓┣┓┃
//WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

int n, k;
ll a[1001];
ll sum[1001];
bool sign[510000][50];
int cont[50];
bool use[510000];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.precision(10);
    cout << fixed;
#ifdef LOCAL_DEFINE
    FILE *stream1;
    //FILE *stream2;
    stream1 = freopen("/home/aim_cpo/ドキュメント/competitive/CLionProject/competitive/in.txt", "r", stdin);
    //stream2 = freopen("out.txt", "w", stdout);
    if (stream1 == NULL) return 0;
    //if (stream2 == NULL) return 0;
#endif
    cin >> n >> k;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        if (i == 0) sum[i] = a[i];
        else {
            sum[i] = sum[i - 1] + a[i];
        }
    }
    vector<ll> v;
    for (int i = 0; i < n; i++) {
        ll now = a[i];
        v.push_back(now);
        for (int j = i + 1; j < n; j++) {
            now += a[j];
            v.push_back(now);
        }
    }
    for (int i = 0; i < (int)v.size(); i++) {
        ll now = v[i];
        for (int j = 0; (ll)(1<<j) <= now; j++) {
            if ((1<<j) & now) {
                sign[i][j] = 1;
                cont[j]++;
            }
        }
    }
//    for (int i = 0; i < (int)v.size(); i++) {
//        for (int j = 0; j < 50; j++) {
//            cout << sign[i][j] << " ";
//        }
//        cout << endl;
//    }
    for (int i = 0; i < (int)v.size(); i++) use[i] = 1;
    for (int i = 49; i >= 0; i--) {
        if (cont[i] < k) continue;
//        for (int j = 0; j < 50; j++) {
//            cout << cont[j] << " ";
//        }
//        cout << endl;
        for (int j = 0; j < 50; j++) cont[j] = 0;
        for (int j = 0; j < (int)v.size(); j++) {
            if (!sign[j][i]) use[j] = 0;
            if (use[j]) {
                for (int l = 0; l < 50; l++) {
                    if (v[j] & (1L<<l)) {
                        //cout << "(" << v[j] << "," << (1<<l) << "," << l << ")" << endl;
                        cont[l]++;
                    }
                }
            }
        }
        if (cont[i] == k) break;
    }
    ll ans = 0;
    ll now = 1;
//    for (int i = 0; i < 50; i++) {
//        cout << cont[i] << " ";
//    }
//    cout << endl;
    for (int i = 0; i < 50; i++) {
        if (cont[i] >= k) ans += now;
        //cout << ans << endl;
        now <<= 1;
    }
    cout << ans << endl;
#ifdef  LOCAL_DEFINE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << "s.\n";
#endif
    return 0;
}