Cod sursa(job #793949)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 4 octombrie 2012 20:18:13
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include "fstream"
#include "algorithm"

#define N 100010
#define zeros(x) (x & -x)

using namespace std;


int aib[N], x[N], s[N], prec[N], n, m, cant[N], imax;

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

void prepareData();
int query(int i);
void update(int i, int c);
void writeData(int i);

int main()
{
	prepareData();
	for(int i=1; i<=n; i++)
	{
		prec[i] = query(x[i]-1);
		cant[i] = cant[prec[i]] + 1;
		if(cant[i] > cant[imax])
		{
			imax = i;
		}
		update(x[i], i);
	}
	writeData(imax);
}

void prepareData()
{
	f >> n;
	for(int i = 1; i <= n; i++)
	{
		f >> x[i];
		s[i] = x[i];
	}
	sort(s + 1, s + n + 1);
	m = 1;
	for(int i = 1; i <= n; i++)
	{
		if( s[i] != s[m-1] )
			s[m++] = s[i];
	}
	for(int i = 1; i <= n; i++)
	{
		x[i] = lower_bound(s + 1, s + m, x[i]) - s;
	}
	f.close();
}

int query(int i)
{
	int imx = 0;
	for(; i; i-=zeros(i))
		if(cant[aib[i]] > cant[imx])
		{
			imx = aib[i];
		}
	return imx;
}

void update(int i, int c)
{
	for(; i<=n; i += zeros(i))
		if(cant[c] > cant[aib[i]])
			aib[i] = c;
}

void writeData(int i)
{
	if(i)
	{
		writeData(prec[i]);
		g << s[x[i]] << ' ';
	}
	else
	{
		g << cant[imax] << '\n';
	}
}