Cod sursa(job #526424)

Utilizator AndreyPAndrei Poenaru AndreyP Data 28 ianuarie 2011 12:26:59
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 5010

int n,n1;
int a[N],v[N],last[N];
int rez = N;

inline void citire() {
	scanf("%d",&n);
	for(int i=1; i<=n; ++i) {
		scanf("%d",&a[i]);
		v[i] = a[i];
	}
}

inline int caut(int x) {
	if(v[1]==x)
		return 1;
	if(v[n1]==x)
		return n1;

	int p=1,u=n1,m;

	while(p<u) {
		m = (p+u)>>1;
		if(x<=v[m])
			u = m;
		else
			p = m+1;
	}

	return p;
}

inline void precalc() {
	sort(v+1,v+n+1);
	n1 = 1;
	for(int i=2; i<=n; ++i) {
		if(v[i]!=v[n1])
			v[++n1] = v[i];
	}

	for(int i=1; i<=n; ++i)
		a[i] = caut(a[i]);
}

inline void rezolva() {
	for(int i=1; i<=n; ++i) {
		if(a[i]==1)
			last[1] = i;
		else {
			if(last[a[i]-1]!=0)
				last[a[i]] = last[a[i]-1];
		}

		if(a[i]==n1 && last[n1]!=0) {
			if(rez>i-last[n1]+1)
				rez = i-last[n1]+1;
		}
	}
}

int main() {
	freopen("secv.in","r",stdin);
	freopen("secv.out","w",stdout);

        citire();
	precalc();
        rezolva();

	if(rez==N)
		rez = -1;
	printf("%d\n",rez);

	return 0;
}