Cod sursa(job #269147)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 2 martie 2009 16:19:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>
#define Nmax 101000
long po,v[Nmax],poz,nr,mij,n,l[Nmax],sol[Nmax],max;
struct vector
{
 long inf;
 long prev;
}a[Nmax];

void citire()
{
 freopen("scmax.in","r",stdin);
 scanf("%ld",&n);
 for(long i=1;i<=n;i++)
	scanf("%ld",&a[i]);
 fclose(stdin);
}

long cautare(long k)
{
 int p=1,u=nr;
 while(p<=u)
 {	mij=(p+u)/2;
	if(a[k].inf<=a[v[mij]].inf)
		u=mij-1;
	else
		p=mij+1;
 }
 return p;

}

void dinamic()
{
 nr=0;max=0;
 for(long i=1;i<=n;i++)
 {	poz=cautare(i);
	v[poz]=i;
	a[i].prev=v[poz-1];
	l[i]=poz;
	if(poz>nr)
		nr=poz;
	if(max<l[i])
		{
		max=l[i];
		po=i;
		}
 }
}

void afis(long po)
{
 if(a[po].prev!=0)
	afis(a[po].prev);
 printf("%ld ",a[po].inf);
}

void afisare()
{
 freopen("scmax.out","w",stdout);

 printf("%ld\n",max);
 afis(po);
 printf("\n");
 fclose(stdout);
}

int main()
{
 citire();
 dinamic();
 afisare();
 return 0;
}