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
#include <stdio.h>
#include <algorithm>
#define SIZE 2001005
#define DEBUG if(0)
 std::pair <int, short int> wina[SIZE];
 int n;

  void calcPrawo(int pos, int row) {
       DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row].first + 1);
       wina[pos].first = wina[pos-row].first + 1;
       if(pos+row+1 <= (n*(n+1))/2) calcPrawo(pos+row+1,row+1);
  }

  void calc(int pos, int add, int row, bool dir) {
      if(!dir) {
        DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row+1].first + add);
        wina[pos].first = wina[pos-row+1].first + add;
      } else {
        DEBUG printf("Pozycja %d to %hd\n",pos,wina[pos-row].first + add);
        wina[pos].first = wina[pos-row].first + add;
      }

      if(pos+row <= (n*(n+1))/2 && add == 1 && !wina[pos+row].first) calc(pos+row,add,row+1, 0);
      if(pos == 1) {
          calcPrawo(1,1);
          return;
      }
      if(pos+row+1 <= (n*(n+1))/2) calc(pos+row+1,(add == 1 ? wina[pos].first : add),row+1, 1);
  }

  int main(void) {
      int k;
      scanf("%d %d",&n,&k);
      for(int i=1; i<=((n*(n+1))/2); i++) scanf("%hd",&wina[i].second);

      calc(1,1,1,0);
      short int min=wina[1].second;
      for(int i=1; i<=((n*(n+1))/2); i++) if(wina[i].first <= k) min = std::min(min,wina[i].second);

      printf("%hd",min);
      return 0;
  }