Cod sursa(job #265618)

Utilizator cameleonGeorgescu Dan cameleon Data 24 februarie 2009 10:03:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<fstream.h>
#define fin "scmax.in"
#define fout "scmax.out"
#define nmax 100010

ifstream f(fin);
ofstream g(fout);

long a[nmax],l[nmax],s[nmax],n,sol[nmax];
void read()
{
f>>n;
for(long i=1;i<=n;i++)f>>a[i];
f.close();
}
long poz(long p,long u,long x)
{
while(p<=u)
	{
	int mij=(p+u)/2;
	if(x==s[mij]) return mij;
	else
	     if(x<s[mij])u=mij-1;
	     else p=mij+1;
	}
return p;
}
void dinamic()
{
s[1]=a[1];l[1]=1;
long p=1,u=1,i,ii=1;long max=l[1];
for(i=2;i<=n;i++)
	{
	int k=poz(p,u,a[i]);
	if(k>u)u=k;
	s[k]=a[i];l[i]=k;
	if(l[i]>max){max=l[i];ii=i;}
	}
long lung=max;i=ii;
while(lung>0)
{
	if(l[i]==lung)
	 {
	 sol[lung]=a[i];
	 lung--;
	 }
  i--;
  }
g<<max<<'\n';
for(i=1;i<=max;i++)
	g<<sol[i]<<" ";
g.close();
}
int main()
{
read();
dinamic();
return 0;
}