#define _CRT_SECURE_NO_WARNINGS
#include <map>
#include <set>
#include <algorithm>
#include <vector>
#include <fstream>
#include <cmath>
#include <ostream>
using namespace std;
struct treap
{
long long meaning, n, k,minzn,minpl;
treap *l, *r, *pr;
};
vector <treap*> obratvspomogvector,obratichodvect;
treap *korendereva;
treap *obratkorendereva;
long long n1rab = 1;
void postroenie_dereva(long long n1)
{
n1rab = 1;
while (n1rab<n1)
{
n1rab *= 2;
}
vector <treap*> vspomogvector(n1rab + 1), ichodvect;
obratvspomogvector.resize(n1rab+1);
for (long long i = 1; i <= n1rab; i++)
{
treap *m = new treap();
vspomogvector[i] = m;
if (i <= n1) {
scanf("%lld", &((vspomogvector[i])->minzn));
((vspomogvector[i])->minpl) = i;
((vspomogvector[i])->n) = i;
((vspomogvector[i])->k) = i;
((vspomogvector[i])->meaning)=1;
}
if (i>n1)
{
((vspomogvector[i])->meaning) = 1;
((vspomogvector[i])->minpl) = i;
((vspomogvector[i])->minzn) = 1000;
((vspomogvector[i])->n) = i;
((vspomogvector[i])->k) = i;
}
(vspomogvector[i])->l = NULL;
(vspomogvector[i])->r = NULL;
ichodvect.push_back(vspomogvector[i]);
//printf("info %d %d\n", 16, (*(ichodvect.end() - 1))->meaning);
}
for (long long j = 1; j <= n1rab; j++)
{
treap *m = new treap();
obratvspomogvector[j] = m;
((obratvspomogvector[j])->minpl) = j;
((obratvspomogvector[j])->n) = j;
((obratvspomogvector[j])->k) = j;
((obratvspomogvector[j])->minzn) =((vspomogvector[(n1rab-j+1)])->minzn) ;
((obratvspomogvector[j])->meaning) = 1;
(obratvspomogvector[j])->l = NULL;
(obratvspomogvector[j])->r = NULL;
// printf("%lld \n",((obratvspomogvector[j])->minzn));
obratichodvect.push_back(obratvspomogvector[j]);
}
long long t = n1rab;
long long chethik = n1rab;
while (t != 1)
{
for (long long i = 1; i <= (t / 2); i++)
{
treap *m = new treap();
long long x = vspomogvector[1]->meaning;
vspomogvector[i] = m;
//printf("%d %d error \n", (vspomogvector[1])->meaning, (vspomogvector[2])->meaning);
if (i == 1) {
((vspomogvector[1])->meaning) = x + (((vspomogvector[2])->meaning));
}
else {
(vspomogvector[i])->meaning = (((vspomogvector[2 * i - 1])->meaning) + ((vspomogvector[2 * i])->meaning));
}
/*changed to ichodvect; chetchik to t; = deleted*/ ((vspomogvector[i])->l) = *(((ichodvect.end()) -= ((t))) + (i - 1));
((vspomogvector[i])->r) = *(((ichodvect.end()) -= ((t))) + (i));
(((vspomogvector[i])->l)->pr) = m;
(((vspomogvector[i])->r)->pr) = m;
ichodvect.push_back(vspomogvector[i]);
//printf("info %d %d\n", t, (vspomogvector[i])->meaning);
//printf("info %d %d\n", t, (*(ichodvect.end() - 1))->meaning);
}
t = t / 2;
}
/* if (n1 == 1)
{
treap*m = new treap();
vspomogvector[n1] = m;
ichodvect.push_back(vspomogvector[n1]);
((vspomogvector[n1])->l) = NULL;
((vspomogvector[n1])->r) = NULL;
}*/
korendereva = (*(ichodvect.end() - 1));
}
treap*a = korendereva;
void zapolnenie(treap* v)
{
if ((v->l)!=NULL)
{if (((v->l)->l)!=NULL)
{zapolnenie(v->l);
zapolnenie(v->r);}
if (((v->l)->minzn)<((v->r)->minzn))
{(v->minzn)=((v->l)->minzn);
(v->minpl)=((v->l)->minpl);}
else
{(v->minzn)=((v->r)->minzn);
(v->minpl)=((v->r)->minpl);}
(v->n)=((v->l)->n);
(v->k)=((v->r)->k);}
else
{(v->l)=NULL;}
korendereva=korendereva;}
void printtt(treap* p1) {
zapolnenie(korendereva);
if (p1!= NULL) {
printtt(p1->l);
if (p1->meaning != 8) {
printf("info %d %d info\n", (p1->pr)->minzn,(p1->pr)->minpl);
}
printtt(p1->r);
}
}
void obratpostroenie_dereva(long long obratn1)
{
long long obratt = n1rab;
long long obratchethik = n1rab;
while (obratt != 1)
{
for (long long obrati = 1; obrati <= (obratt / 2); obrati++)
{
treap *obratm = new treap();
long long obratx = obratvspomogvector[1]->meaning;
obratvspomogvector[obrati] = obratm;
//printf("%d %d error \n", (vspomogvector[1])->meaning, (vspomogvector[2])->meaning);
if (obrati == 1) {
((obratvspomogvector[1])->meaning) = obratx + (((obratvspomogvector[2])->meaning));
}
else {
(obratvspomogvector[obrati])->meaning = (((obratvspomogvector[2 * obrati - 1])->meaning) + ((obratvspomogvector[2 * obrati])->meaning));
}
/*changed to ichodvect; chetchik to t; = deleted*/ ((obratvspomogvector[obrati])->l) = *(((obratichodvect.end()) -= ((obratt))) + (obrati - 1));
((obratvspomogvector[obrati])->r) = *(((obratichodvect.end()) -= ((obratt))) + (obrati));
(((obratvspomogvector[obrati])->l)->pr) = obratm;
(((obratvspomogvector[obrati])->r)->pr) = obratm;
obratichodvect.push_back(obratvspomogvector[obrati]);
//printf("info %d %d\n", t, (vspomogvector[i])->meaning);
//printf("info %d %d\n", t, (*(ichodvect.end() - 1))->meaning);
}
obratt = obratt / 2;
}
/* if (n1 == 1)
{
treap*m = new treap();
vspomogvector[n1] = m;
ichodvect.push_back(vspomogvector[n1]);
((vspomogvector[n1])->l) = NULL;
((vspomogvector[n1])->r) = NULL;
}*/
obratkorendereva = (*(obratichodvect.end() - 1));
}
treap*obrata = obratkorendereva;
void obratzapolnenie(treap* obratv)
{
if ((obratv->l)!=NULL)
{if (((obratv->l)->l)!=NULL)
{zapolnenie(obratv->l);
zapolnenie(obratv->r);}
if (((obratv->l)->minzn)<((obratv->r)->minzn))
{(obratv->minzn)=((obratv->l)->minzn);
(obratv->minpl)=((obratv->l)->minpl);}
else
{(obratv->minzn)=((obratv->r)->minzn);
(obratv->minpl)=((obratv->r)->minpl);}
(obratv->n)=((obratv->l)->n);
(obratv->k)=((obratv->r)->k);}
else
{(obratv->l)=NULL;}
obratkorendereva=obratkorendereva;}
void obratprinttt(treap* obratp1) {
obratzapolnenie(obratkorendereva);
if (obratp1!= NULL) {
obratprinttt(obratp1->l);
if (obratp1->meaning != 8) {
printf("info %d %d info\n", (obratp1->pr)->minzn,(obratp1->pr)->minpl);
}
printtt(obratp1->r);
}
}
treap* minimum(treap* c2,treap* d2)
{if ((c2->minzn)>(d2->minzn))
{return(d2);}
else
{return(c2);};}
treap* min(long long q3, treap* uzel)
{if (q3=((uzel->k)-(uzel->n)+1))
{return(uzel);}
if ((((uzel->l)->k)-((uzel->l)->n)+1)>q3)
{return (min(q3,(uzel->l))); }
else
{return minimum((uzel->l),min(q3-((uzel->l)->k),uzel->r));}
;}
treap* iskatotrezok(long long c1,long long d1,treap* verch1)
{if ((c1<=(verch1->n))&&((verch1->k)<=d1))
{return(verch1);}
else
{treap* v2=iskatotrezok(c1,d1,(verch1->l));
treap* v3=iskatotrezok(c1,d1,(verch1->r));
if (((v2->k)-(v2->n))>((v3->k)-(v3->n)))
{return v2;}
else
{return v3;}
;}
;}
treap* poisk_legko(long long c,long long d)
{
treap* verchf;
treap* prmin;
treap* promezh;
treap* verch=iskatotrezok(c,d,korendereva);
treap* znpr=verch;
if (d=(verch->k))
{//proverka levogo;
if (c=(verch->n))
{return(verch);}
else
{verchf=iskatotrezok(n1rab-d+1,n1rab-c+1,obratkorendereva);
verch=verchf;
//proverka <na> prav;
if (((verch->pr)->k)==(verch->k))
{verch=((((verch->pr)->pr)->r)->l);
promezh=min (((n1rab-c+1)-(verchf->k)),verch);
return (minimum (znpr,promezh ));}
else
{verch=((verch->pr)->r);
return(minimum(znpr,min((n1rab-c+1)-(verchf->k),verch)));}
;}
;}
else
{ //proverka <na> prav;
if (((verch->pr)->k)==(verch->k))
{verch=((((verch->pr)->pr)->r)->l);
prmin=minimum(znpr,min((n1rab-d+1)-(verchf->k),verch));}
else
{verch=((verch->pr)->r);
prmin=minimum(znpr, min((n1rab-d+1)-(verchf->k),verch));}
{//proverka levogo;
if (c=(verch->n))
{return(prmin);}
else
{verchf=iskatotrezok(n1rab-d+1,n1rab-c+1,obratkorendereva);
verch=verchf;
//proverka <na> prav;
if (((verch->pr)->k)==(verch->k))
{verch=((((verch->pr)->pr)->r)->l);
return(minimum(prmin,min((n1rab-c+1)-(verchf->k),verch)));}
else
{verch=((verch->pr)->r);
return(minimum(prmin,min((n1rab-c+1)-(verchf->k),verch)));}
;}
;}
;}
;}
long long i2, m2, n2, a2, b2;
int main()
{
/* freopen("rsq.in", "r", stdin);
freopen("rsq.out", "w", stdout);*/
scanf("%d%d", &n2, &m2);
postroenie_dereva(n2);
obratpostroenie_dereva(n2);
printtt(korendereva);
printf("%lld \n",(iskatotrezok(5,7,(korendereva->r)))->minpl);
}