Cod sursa(job #570160)

Utilizator rootsroots1 roots Data 2 aprilie 2011 17:45:32
Problema Secv Scor 100
Compilator cpp Status done
Runda 105 Marime 1.16 kb
#include <stdio.h>
#include <string.h>
#include <set>

#define Dim 5005

using namespace std;

set <int> check;

int v[Dim],d[Dim],q[Dim];

int BS(int x,int L,int R)
{
	if(L<=R)
	{
		int M=L+(R-L)/2;

		if(x<q[M]) return BS(x,M+1,R);
		else return BS(x,L,M-1);
	}
	else return L;
}

int main()
{
	int i,size,N,pos,sol,dif;

	freopen("secv.in","r",stdin);

	scanf("%d",&N);
	for(i=1;i<=N;i++)
	{
		scanf("%d",&v[i]);
		check.insert(v[i]);
	}

	sol=check.size();

	memset(d,0,sizeof(d));
	memset(q,0,sizeof(q));
	q[1]=v[N];
	size=1;
	d[N]=1;

	for(i=N-1;i>0;i--)
		if(q[size]>v[i])
		{
			size++;
			q[size]=v[i];
			d[i]=size;
		}
		else
		{
			pos=BS(v[i],1,size);
			q[pos]=v[i];
			d[i]=pos;
		}

	pos=-1;
	for(i=1;i<=N;i++)
		if(d[i]==sol)
		{
			pos=i;
			break;
		}

	freopen("secv.out","w",stdout);

	if(pos==-1)
	{
		printf("-1\n");

		return 0;
	}

	dif=-1;
	while(pos<=N)
	{
		if(d[pos]==sol)
		{
			i=pos;
			size=sol;
			while(i<=N&&size)
			{
				if(d[i]==size) size--;
				i++;
			}
			if(dif>i-pos||dif==-1) dif=i-pos;
		}

		pos++;
	}

	printf("%d\n",dif);

	return 0;
}