//#include <cstdlib>
//#include <iostream>



//int MyNodeId() {return 0;}

/*
int PipeHeight() {return 35;}
long long HoleDiameter(long long iii)
{long long sred[] = {-1,15,13,14,16,20,13,11,15,10,11, 12,9,11,7,9,10,11,6,10,15, 7,6,5,7,9,3,5,3,2,5, 3,1,3,5,6};
return sred[iii];}
int NumberOfDiscs() {return 11;}
long long DiscDiameter(long long iii)
{long long dys[] = {-1,2,5,3,2,6,3,7,6,7,8, 5};
return dys[iii];} // Odp: 12
*/
/*
int PipeHeight() {return 35;}
long long HoleDiameter(long long iii)
{long long sred[] = {-3,15,13,14,16,20,13,11,15,10,11, 12,9,11,7,9,10,11,6,10,15, 7,6,5,7,9,3,5,3,2,5, 3,1,3,5,6};
return sred[iii];}
int NumberOfDiscs() {return 11;}
long long DiscDiameter(long long iii)
{long long dys[] = {-3,1,1,1,1,1,1,1,1,1,1, 1};
return dys[iii];} // Odp: 25
*/
/*
int PipeHeight() {return 10;}
long long HoleDiameter(long long iii)
{long long sred[] = {-3,15,13,14,16,20,13,11,15,10,11};
return sred[iii];}
int NumberOfDiscs() {return 11;}
long long DiscDiameter(long long iii)
{long long dys[] = {-3,1,1,1,1,1,1,1,1,1,1, 1};
return dys[iii];} // Odp: 0
*/
/*
int PipeHeight() {return 35;}
long long HoleDiameter(long long iii)
{long long sred[] = {-3,15,13,14,16,20,13,11,15,10,11, 12,9,11,7,9,10,11,6,10,15, 7,6,5,7,9,3,5,3,2,5, 3,1,3,5,6};
return sred[iii];}
int NumberOfDiscs() {return 6;}
long long DiscDiameter(long long iii)
{long long dys[] = {-3,4,7,3,2,14,5};
return dys[iii];} // Odp: 0
*/
/*
int PipeHeight() {return 35;}
long long HoleDiameter(long long iii)
{long long sred[] = {-3,15,13,14,16,20,13,11,15,10,11, 12,9,11,7,9,10,11,6,10,15, 7,6,5,7,9,3,5,3,2,5, 3,1,3,5,6};
return sred[iii];}
int NumberOfDiscs() {return 6;}
long long DiscDiameter(long long iii)
{long long dys[] = {-3,4,7,3,2,14,25};
return dys[iii];} // Odp: 0
*/
/*
int PipeHeight() {return 35;}
long long HoleDiameter(long long iii)
{long long sred[] = {-3,15,13,14,16,20,13,11,15,10,11, 12,9,11,7,9,10,11,6,10,15, 7,6,5,7,9,3,5,3,2,5, 3,1,3,5,6};
return sred[iii];}
int NumberOfDiscs() {return 11;}
long long DiscDiameter(long long iii)
{long long dys[] = {-3,4,7,3,2,20,5,3,2,5,11, 2};
return dys[iii];} // Odp: 0
*/





#include <stdio.h>

#include "krazki.h"
#include "message.h"

int n_wys,m_dys;
//long long srednice[2000002];
//long long dyski[2000002];

long long oparcia[20000002];
int mapka[20000002];
long long sr_min,pomka,sr_max;
int licz_opar,umiejsc,um_zaklin,wsk_ost_opar;

int ZNAJDZ_ZAKLIN(long long srednica,int pocz,int kon)
{
// Szukam w tablicy 'oparcia' takiej wartości w, aby
// oparcia[w]<srednica
// oparcia[w-1]>=srednica
// i wtedy krążek zatrzyma się na pozycji 'mapka[w]-1' i to właśnie zwracam

// 'w' przyjmuje wartości od 1 do wsk_ost_opar.
// Gdy znajdę interesujące mnie w, to wsk_ost_opar=w (bo może być tylko "trochę" większy)

//No i zabezpieczenie, gdyby krążek miał się nigdzie nie zatrzymać (czyli oparcia[kon]>=srednica)
int propozycja;
if (kon==wsk_ost_opar)
	{
	if (pocz>kon)
	   {// Przypadek, gdy pierścień przelatuje przez rurę.
	   return -1;
	   }
	//Przesuwam w stronę końca tabeli, bo prawdopodobnie to jest gdzieś tam
	propozycja= (9*kon + pocz)/10; //zaczynam w 9/10 różnicy
	}
else
   {
   // Jeśli zatrzyma się na pierwszym - dodanie zerowego pola w 'oparcia'
   propozycja= (kon+pocz)/2; //Teraz już binarnie
   }

if ((oparcia[propozycja]<srednica) && (oparcia[propozycja-1]>=srednica))
	{
	wsk_ost_opar=propozycja;
	return mapka[propozycja]-1;
	}
else if ((oparcia[propozycja]>=srednica) && (oparcia[propozycja-1]>=srednica))
	{
	return ZNAJDZ_ZAKLIN(srednica,propozycja+1,kon);
	}
else if ((oparcia[propozycja]<srednica) && (oparcia[propozycja-1]<srednica))
	{
	return ZNAJDZ_ZAKLIN(srednica,pocz,propozycja-1);
	}
}

int main()
{
// Tylko zerowy komputer cos liczy.
if (MyNodeId() != 0) {
   return 0;
}
n_wys=PipeHeight();
m_dys=NumberOfDiscs();

if (m_dys>n_wys)
   {
   //Jeśli liczba dysków jest większa od wysokości wieży, 
	//to ostatni na pewno się nie zmieści
	printf("0 ");
	return 0;
   }

/*for (int i=1;i<=n_wys;i++) srednice[i]=HoleDiameter(i);
for (int j=1;j<=m_dys;j++) dyski[j]=DiscDiameter(j);

printf("Srednice:\n");
for (int i=1; i<=n_wys; i++) printf("%ld, ",srednice[i]);
printf("\n\nDyski:\n");
for (int i=1; i<=m_dys; i++) printf("%ld, ",dyski[i]);
printf("\n\n");
*/
sr_min=HoleDiameter(1);
licz_opar=1; 
oparcia[0]=1000000000000000002;
oparcia[licz_opar]=sr_min;
mapka[licz_opar]=1;
for (int i=2; i<=n_wys; i++)
   {
   pomka=HoleDiameter(i);
   if (pomka<sr_min)
      {
      sr_min=pomka;
      licz_opar++;
      oparcia[licz_opar]=pomka;
      mapka[licz_opar]=i;
      }
   }

///////////////// TO TYLKO DLA ZEROWEJ INSTANCJI: //////////////////
            licz_opar++;
            oparcia[licz_opar]=0;
            mapka[licz_opar]=n_wys+1;
////////////////////////////////////////////////////////////////////


//for (int i=1; i<=licz_opar; i++) printf("%lld => %ld\n",oparcia[i],mapka[i]);


sr_max=DiscDiameter(1);
wsk_ost_opar=licz_opar;
umiejsc=ZNAJDZ_ZAKLIN(sr_max,1,wsk_ost_opar);
for (int i=2; i<=m_dys; i++)
   {
   pomka=DiscDiameter(i);
   if (pomka>sr_max)
      {
      sr_max=pomka;
//      printf("wiekszy\n");
      // ten dysk jest dotąd największy, więc trzeba poszukać, na czym się zaklinuje
      // (i sprawdzić, czy wcześniej nie uderzy w już ułożoną wieżę innych krążków)
      um_zaklin=ZNAJDZ_ZAKLIN(pomka,1,wsk_ost_opar);
      if (um_zaklin!=-1)
         {
         // Czyli się gdzieś zaklinował, trzeba tylko sprawdzić, czy nad ostatnim
//         printf("um_zaklin=%ld   umiejsc=%ld\n",um_zaklin,umiejsc);
         if (um_zaklin<umiejsc) umiejsc=um_zaklin;
         else umiejsc--;
         }
      }
   else
      {// ten dysk ma taką samą lub mniejszą średnicę, niż poprzednie, więc albo ułoży się
      // na ostatnim, albo przeleci razem z innymi.
//      printf("mniejszy\n");
      if (umiejsc!=-1)
         {
         umiejsc--;
         }
      }
//   if (umiejsc<1)
  //    {
    //  ZATRZYMANIE!!!!
      //}
//   printf("Dysk nr %ld o srednicy %lld zatrzymal sie na %ld pozycji.\n",i,pomka,umiejsc);
   
   if (umiejsc==0)
      {
      // Jeśli działam na jednym węźle, to obecność tu oznacza, że należy wypisać 0
      printf("%ld ",umiejsc);
      return 0;
      
      // Jeśli działam na wielu węzłach, to w tym momencie posiadam informację istotną z punktu widzenia dalszych działań.
      // Informację tą powinienem przesłać do zerowego węzła, a jeśli to jest zerowy, to ją zachować i przejść do odbioru od pozostałych
      // Te istotne informacje to pozycja, na której zatrzymał się dany krążek (jeśli w środku, to ostatni, a jeśli na zerowej, to ten,
      // który właśnie tam wypadł.
      
      }
   }

// Jeśli działam na jednym węźle, to w tym miejscu wypisuję wynik:
printf("%ld ",umiejsc);

// Jeśli działam na wielu węzłach, to teraz powinienem przesłać wszystkie informacje do zerowego i podać ostateczną informację.




return 0;
}




