Cod sursa(job #1096281)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 1 februarie 2014 20:05:03
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#include<algorithm>

const int nmax = 5300;

using namespace std;
int a[nmax],n,maxime[nmax],drum[nmax],pr[20000000],nr=0;

int pozitia(int k){
	if(maxime[k]==1)return k;
    return	pozitia(drum[k]);
	
}
int numarul(int k){
	if(maxime[k]==1)return 1;
    return	(numarul(drum[k])+1);
	
}
main(){
 
     freopen("secv.in","r",stdin);
     freopen("secv.out","w",stdout);      
 scanf("%d ",&n);

for(int i=1;i<=n;i++){
	scanf("%d ",&a[i]);
	 if(pr[a[i]]!=1)nr++;
    pr[a[i]]=1;
}
maxime[n]=1;drum[n]=-1;
int max = n;
for(int i=n-1;i>0;i--){
	maxime[i]=1;drum[i]=-1;
	for(int j=i+1;j<=n;j++)
	 if(a[i]<a[j] && maxime[i]<maxime[j]+1){
	 	maxime[i]=maxime[j]+1;
	 	drum[i]=j;
	 	if(maxime[max]<maxime[i])max=i;
	 }
}
//for(int i=1;i<=n;i++)printf("%d ",maxime[i]);printf("\n");
//for(int i=1;i<=n;i++)printf("%d ",drum[i]);printf("\n");
int mm = 100000000;
 int sf ,ok=0,nn;
for(int i=1;i<=n;i++){
	if(maxime[max]==maxime[i]){
		 sf = pozitia(i);
		 nn = numarul(i);
		 if(sf-i+1<mm && nn==nr){
		 	mm=sf-i+1;
			 if(nn==nr)ok=1;
		 }
	}
}
if(ok==0)mm=-1;
	 printf("%d",mm);
}