Cod sursa(job #873230)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 6 februarie 2013 23:05:18
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<fstream>
#include<algorithm>
using namespace std;

struct st
{
	int x,y,z;
};

st a[100001],c[100001];
int b[100001],aib[100001],i,n,x,y;

ifstream f("scmax.in");
ofstream g("scmax.out");

void update(int k,int x)
{
	int i;
	for (i=k;i<=n;i=(i | (i-1))+1)
		aib[i]=max(aib[i],x);
}

int query(int k)
{
	int i,s=0;
	for (i=k;i>0;i=i & (i-1))
		s=max(s,aib[i]);
	return s;
}

void afis()
{
	int p;
	while (i>1)
	{
		i--;
		if ((b[i]==x) && (c[i].x<y))
		{
			p=c[i].x;
			x--;
			y=c[i].x;
			afis();
			g << p << ' ';
		}
	}
}

bool cmp(st a,st b)
{
	return a.x<b.x;
}

int main()
{
	f >> n;
	for (i=1;i<=n;i++)
	{
		f >> a[i].x;
		a[i].z=i;
	}
	sort(a+1,a+n+1,cmp);
	x=0;
	for (i=1;i<=n;i++)
	{
		if (a[i].x!=a[i-1].x)
			x++;
		a[i].y=x;
	}	
	for (i=1;i<=n;i++)
		c[a[i].z]=a[i];
	for (i=1;i<=n;i++)
	{
		b[i]=query(c[i].y-1)+1;
		update(c[i].y,b[i]);
	}
	x=0;
	for (i=n;i>=1;i--)
		if (b[i]>x)
		{
			x=b[i];
			y=c[i].x;
		}
	y++;
	i=n+1;
	g << x << "\n";
	afis();
	return 0;
}