1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <list>
#include <time.h>
#include <math.h>
#include <random>
#include <deque>
#include <queue>
#include <cassert>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <chrono>
#include <cstring>

using namespace std;

typedef long long ll;

/*
#ifdef iq
  mt19937 rnd(228);
#else
  mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif
*/

const int N = 2005;

int a[N][N];
int dp[N][N];

int main() {
#ifdef iq
  freopen("a.in", "r", stdin);
  //freopen("a.out", "w", stdout);
#endif
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n, k;
  while (cin >> n >> k) {
    for (int i = 0; i < n; i++) for (int j = 0; j <= i; j++) dp[i][j] = 0;
    int ans = 3000;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j <= i; j++) {
        cin >> a[i][j];
        if (i + 1 < n) {
          dp[i + 1][j] += dp[i][j] + 1;
          dp[i + 1][j + 1] += dp[i][j] + 1;
          if (i + 2 < n) {
            dp[i + 2][j + 1] -= dp[i][j] + 1;
          }
        }
        int cnt = n - i;
        int ok = n * (n + 1) / 2;
        int rest = dp[i][j];
        ok -= rest;
        if (rest < k && ok - cnt * (cnt + 1) / 2 >= k - 1 - rest) {
          ans = min(ans, a[i][j]);
        }
      }
    }
    cout << ans << endl;
  }
}