Cod sursa(job #827571)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 2 decembrie 2012 12:10:01
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<malloc.h>
#include<algorithm>
#define zeros(x) ((x)&(-x))

using namespace std;

ifstream reader("scmax.in");
ofstream writer("scmax.out");

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

int query(int *aib, int *values, int ind)
{
	int max = 0;

	for(int i = ind; i > 0; i-=zeros(i))
		if(values[aib[i]] > values[max])
			max = aib[i];

	return max;
}

void afisSol(int *prev, int *sortedSir, int *sir, int current)
{
	if(prev[current])
		afisSol(prev, sortedSir, sir, prev[current]);
	writer << sortedSir[sir[current]] << ' ';
}

int main()
{
	int *sir, *sortedSir, *aib, *pos, *val, *prec;
	int n, nSorted = 0, maxx = 1;
	reader >> n;

	sir = new int[n + 1];
	sortedSir = new int[n + 1];
	pos = new int[n + 1];
	val = (int*) calloc(n + 1, sizeof(int));
	aib = (int*) calloc(n + 1, sizeof(int));
	prec = (int*) calloc(n + 1, sizeof(int));

	for(int i = 1; i <= n; i++)
	{
		reader >> sir[i];
		sortedSir[i] = sir[i];
	}

	sort(sortedSir + 1, sortedSir + n + 1);

	for(int i = 1; i <= n; i++)
		if(sortedSir[i] != sortedSir[i - 1])
			sortedSir[++nSorted] = sortedSir[i];

	for(int i = 1; i <= n; i++)
		sir[i] = lower_bound(sortedSir + 1, sortedSir + nSorted, sir[i]) - sortedSir;

	for(int i = 1; i <= n; i++)
	{
		prec[i] = query(aib, val, sir[i] - 1);
		val[i] = val[prec[i]] + 1;
		if(val[i] > val[maxx])
			maxx = i;
		update(aib, val, n, sir[i], i);
	}

	writer << val[maxx] << '\n';

	afisSol(prec, sortedSir, sir, maxx);

	writer << '\n';

	return 0;
}