Cod sursa(job #656143)

Utilizator c_adelinaCristescu Adelina c_adelina Data 3 ianuarie 2012 23:34:04
Problema Subsir 2 Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
int main()
{
	int n,v[5005],sol[5005],min,poz,i,j,list[5005],nr=1;
	
	freopen("subsir2.in","r",stdin);
	freopen("subsir2.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;++i) scanf("%d",&v[i]);
	list[1]=n;sol[n]=1;
	for (i=n-1;i>0;--i)
	{
		if ((nr<1) || (list[1]<v[i])) 
			sol[i]=1,list[nr=1]=i; else
			{
				int a=1,b=nr,poz=1,c;
				while (a<=b)
				{
					c=(a+b)/2;
					if (v[list[c]]<v[i]) b=c-1; else
					{
						a=c+1;
						if (c>poz) poz=c;
					}
				}
				sol[i]=1+sol[list[poz]];
			}
		while ((nr) && (v[list[nr]]<=v[i])) --nr;
		list[++nr]=i;
	}
	j=v[1];min=sol[1];poz=1;
	for (i=2;i<=n;++i)
		if (v[i]<j)
		{
			j=v[i];
			if (sol[i]<min) min=sol[i],poz=i;
		}		
			
	printf("%d\n",min);
return 0;
}