Cod sursa(job #749918)

Utilizator loginLogin Iustin Anca login Data 19 mai 2012 17:27:11
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
# include <fstream>
# include <iostream>
# include <algorithm>
# define DIM 100003
using namespace std;
struct nod{
	int v, i;
	nod(){}
	nod(int V, int I){
		v=V;i=I;}
	friend bool operator < (const nod &a, const nod &b){
		return a.v<b.v;
	}
}w[DIM];
int n, m, 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>>w[i].v;
		w[i].i=i;
		e[i]=w[i].v;
	}
}

void uniform ()
{
	sort(w+1, w+n+1);
	for(int i=1;i<=n;++i)
		if (w[i].v!=w[i-1].v)
			v[w[i].i]=++m;
		else
			v[w[i].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[r]<b[v[a[p]]])
			r=a[p];
		p-=p^(p&(p-1));
	}
	return r;
}

void solve()
{
	b[v[1]]=1;
	upd(v[1],1);
	for(int i=2;i<=n;++i)
	{
		int poz=query(v[i]-1);
		if (poz)
		{
			p[i]=poz;
			b[v[i]]=max(b[v[poz]]+1,b[v[i]]);
		}
		else
			b[v[i]]=max(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;
}