Cod sursa(job #744558)

Utilizator rootsroots1 roots Data 9 mai 2012 00:43:31
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cstring>
#include <algorithm>

#define maxN 131072
#define lsb(x) ((-x)&x)

using namespace std;

ifstream in;
ofstream out;

int v[maxN];
struct two
{
	int v,p;
}aux[maxN];
int norm[maxN];
int pos[maxN];

int d[maxN];
int aib[maxN];
int t[maxN];

inline bool cmp(const two &a,const two &b)
{
	return a.v<b.v;
}

inline int query(int idx)
{
	int ret=0;

	for(;idx>0;idx-=lsb(idx))
		if(d[aib[idx]]>d[ret])
			ret=aib[idx];

	return ret;
}

inline void update(int idx,int val)
{
	for(;idx<maxN;idx+=lsb(idx))
		if(d[aib[idx]]<d[val])
			aib[idx]=val;
}

int main()
{
	int N;

	in.open("scmax.in");

	in>>N;
	for(int i=1;i<=N;++i)
		in>>v[i];

	in.close();

	for(int i=1;i<=N;++i)
	{
		aux[i].v=v[i];
		aux[i].p=i;
	}

	sort(aux+1,aux+N+1,cmp);

	norm[aux[1].p]=1;
	pos[1]=aux[1].p;
	for(int i=2;i<=N;++i)
	{
		norm[aux[i].p]=norm[aux[i-1].p];
		if(aux[i].v!=aux[i-1].v) ++norm[aux[i].p];
		pos[i]=aux[i].p;
	}

	memset(d,0,sizeof(d));
	memset(aib,0,sizeof(aib));

	int sol=0;

	for(int i=1;i<=N;++i)
	{
		t[i]=query(norm[i]-1);
		d[i]=1+d[t[i]];
		update(norm[i],i);

		if(d[sol]<d[i]) sol=i;
	}

	out.open("scmax.out");

	out<<d[sol]<<'\n';

	memset(norm,0,sizeof(norm));
	for(int x=sol;x;x=t[x])
		norm[++norm[0]]=v[pos[x]];

	for(int i=norm[0];i>0;--i)
		out<<norm[i]<<' ';
	out<<'\n';

	out.close();

	return 0;
}