Pagini recente » Cod sursa (job #2097092) | Cod sursa (job #2484425) | Cod sursa (job #2671420) | Cod sursa (job #1348709) | Cod sursa (job #1998838)
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
//ok nlogn gata
const int nmax=5005;
map<int,int> m;
int maxval,maxstart,poz,val,startum;
struct al
{
int x,start;
}d[nmax],arb[4*nmax+5];
struct humus
{
int x,i;
}v[nmax];
inline void update(int node,int st,int dr)
{
if(st==dr)
{
arb[node].x=val;
arb[node].start=startum;
return;
}
int med=((dr-st)>>1) + st;
if(med<poz)
update(node<<1|1,med+1,dr);
else
update(node<<1,st,med);
if(arb[node<<1].x>arb[node<<1|1].x || (arb[node<<1].x==arb[node<<1|1].x && arb[node<<1].start > arb[node<<1|1].start))
arb[node]=arb[node<<1];
else
arb[node]=arb[node<<1|1];
}
inline void query(int node,int st,int dr)
{
if(1<=st&&dr<=poz)
{
if(maxval<arb[node].x)
{
maxval=arb[node].x;
maxstart=arb[node].start;
}
else if(maxval==arb[node].x&&maxstart<arb[node].start)
maxstart=arb[node].start;
return;
}
int med=((dr-st)>>1) + st;
if(st<=poz)
query(node<<1,st,med);
if(med<poz)
query(node<<1|1,med+1,dr);
}
inline bool cmp(humus a,humus b)
{
if(a.x==b.x)
return a.i>b.i;
return a.x<b.x;
}
int main()
{
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
int n,i,j,cnt=0;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&v[i].x),v[i].i=i;
if(m.find(v[i].x)==m.end())
m[v[i].x]=++cnt;
}
sort(v+1,v+n+1,cmp);
for(i=1;i<=n;++i)
{
poz=v[i].i;
maxval=0;
maxstart=i;
query(1,1,n);
val=d[v[i].i].x=maxval+1;
startum=d[v[i].i].start=maxstart;
update(1,1,n);
}
int lngmin=5005;
for(i=1;i<=n;++i)
{
if(d[i].x==cnt&&i-d[i].start+1<lngmin)
lngmin=i-d[i].start+1;
}
if(lngmin==5005)
printf("-1");
else
printf("%d",lngmin);
}