Cod sursa(job #204105)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 21 august 2008 20:47:19
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<stdlib.h>

#define NMAX 5000

int n,v[NMAX+1],w[NMAX+1];
int l[NMAX+1],next[NMAX+1],pf[NMAX+1];
int min,max;

int fcmp(const void*a, const void*b){
if(*(int*)a>*(int*)b) return 1;
else if(*(int*)a<*(int*)b) return -1;
	 else return 0;
}

int main(){
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
int n,m,i,j,k,pumax,ppmin,lmax,lc,lmin;
scanf("%d",&n);
for(i=1;i<=n;++i){
	scanf("%d",&v[i]);
	w[i]=v[i];
	}
qsort(w,n+1,sizeof(w[0]),fcmp);
m=1;
for(i=2;i<=n;++i)
	if(w[i]!=w[i-1]) {m++;w[m]=w[i];}
min=w[1],max=w[m];
pumax=n;
while(v[pumax]!=max) pumax--;
ppmin=1;
while(v[ppmin]!=min) ppmin++;
l[pumax]=1;
for(i=pumax-1;i>=ppmin;--i){
	lmax=0;
	for(j=i+1;j<=pumax;++j)
		if(v[i]<v[j])
			if(lmax<l[j])
				{lmax=l[j];next[i]=j;}
			else if(lmax==l[j]&&v[next[i]]>v[j]) next[i]=j;
	l[i]=lmax+1;
	}
int first;
lmax=0;
for(i=ppmin;i<=pumax;++i)
	if(lmax<l[i]) {lmax=l[i];first=i;}
if(lmax<m) {printf("-1");return 0;}
k=0;
for(i=first;i<=pumax;++i)
	if(lmax==l[i]) k++,pf[k]=i;
int pi,pu;
lmin=n;
for(i=1;i<=k;++i){
	pi=pf[i];
	j=pi;
	while(next[j]) {
		j=next[j];
		}
	pu=j;
	lc=pu-pi+1;
	if(lmin>lc) lmin=lc;
	}
printf("%d",lmin);
return 0;
}