Cod sursa(job #749927)

Utilizator loginLogin Iustin Anca login Data 19 mai 2012 17:48:12
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
# include <fstream>
# include <iostream>
# include <algorithm>
# include <cassert>
# define DIM 100003
using namespace std;
int n, m, w[DIM], v[DIM], p[DIM], e[DIM], a[DIM], b[DIM], ps;

void read ()
{
	ifstream fin ("scmax.in");
	fin>>n;
	for(int i=1;i<=n;++i)
	{
		fin>>e[i];
		assert(e[i]>0);
		w[i]=i;
	}
}

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

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

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

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

void solve()
{
	for(int i=1;i<=n;++i)
	{
		int poz=query(v[i]-1);
		if (poz)
		{
			p[i]=poz;
			b[v[i]]=b[v[poz]]+1;
		}
		else
			b[v[i]]=1;
		upd(v[i],i);
		if (b[v[ps]]<b[v[i]])
			ps=i;
	}
}

void print ()
{
	ofstream fout ("scmax.out");
	while(ps)
	{
		v[++v[0]]=e[ps];
		ps=p[ps];
	}
	fout<<v[0]<<"\n";
	for(int i=v[0];i;--i)
		fout<<v[i]<<" ";
}

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