Cod sursa(job #751291)

Utilizator loginLogin Iustin Anca login Data 25 mai 2012 14:20:28
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
# include <fstream>
# include <iostream>
# include <algorithm>
# define DIM 100003
using namespace std;
int n, m, w[DIM], v[DIM], a[DIM], p[DIM], b[DIM], poz[DIM], c[DIM], sol, st;

void read ()
{
	ifstream fin ("scmax.in");
	fin>>n;
	for(int i=1;i<=n;++i)
		fin>>v[i], p[i]=i;
}

inline bool cmp (int i, int j)
{
	return v[i]<v[j];
}

void uniform ()
{
	sort(p+1, p+n+1, cmp);
	for(int i=1;i<=n;++i)
		if (v[p[i]]!=v[p[i]-1])
			w[p[i]]=++m, c[m]=v[p[i]];
		else
			w[p[i]]=m;
}

int query (int p)
{
	int r=0, e=0;
	while(p)
	{
		if (e<b[a[p]])
			e=b[a[p]], r=a[p];
		p-=p^(p&(p-1));
	}
	return r;
}

void upd (int p)
{
	int r=p;
	a[p]=r;
	while(p<=m)
	{
		if (b[r]>b[a[p]])
			a[p]=r;
		p+=p^(p&(p-1));
	}
}

void solve ()
{
	int q;
	for(int i=1;i<=n;++i)
	{
		q=query(w[i]-1);
		b[w[i]]=b[q]+1;
		poz[w[i]]=q;
		upd(w[i]);
		if (b[w[i]]>sol)
			sol=b[w[i]], st=w[i];
	}
}

void print ()
{
	ofstream fout ("scmax.out");
	fout<<sol<<"\n";
	w[0]=0;
	while(st)
	{
		v[++v[0]]=c[st];
		st=poz[st];
	}
	for(int i=sol;i;--i)
		fout<<v[i]<<" ";
}
	

int main ()
{
	read ();
	uniform ();
	solve ();
	print();
	return 0;
}