Cod sursa(job #830495)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 6 decembrie 2012 22:47:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include<stdio.h>
#include<malloc.h>
#include<algorithm>
#define mx(a, b) (lg[a] > lg[b]? a : b)
#define max(a, b) (a > b? a : b)
using namespace std;

void modify(int *tree, int poz, int val, int cur, int st, int dr, int *lg)
{
	int m = (dr + st)>>1;
	if(dr == st)
	{
		tree[cur] = val;
	}
	else
	{
		if(poz<=m)
		{
			modify(tree, poz, val, 2*cur, st, m, lg);
		}
		else
		{
			modify(tree, poz, val, 2*cur+1, m+1, dr, lg);
		}
		tree[cur] = mx(tree[cur*2], tree[cur*2+1]);
	}
}

int interogate(int *tree, int s, int d, int cur, int st, int dr, int *lg)
{
	if(s <= st && d >= dr)
	{
		return tree[cur];
	}
	else
	{
		int m = (st + dr) >> 1;
		if(s <= m)
		{
			if(d > m)
			{
				int a = interogate(tree, s, d, 2 * cur, st, m, lg), b = interogate(tree, s, d, 2 * cur + 1, m+1, dr, lg);
				return mx(a,b);
			}
			else
			{
				return interogate(tree, s, d, 2 * cur, st, m, lg);
			}
		}
		else
		{
			return interogate(tree, s, d, 2 * cur + 1, m+1, dr, lg);
		}
	}
}

void printData(int i, int *sir, int *sirSortat, int *prev)
{
	if(i)
	{
		printData(prev[i], sir, sirSortat, prev);
		printf("%d ", sirSortat[sir[i]]);
	}
}

int main()
{
	int *sir, *sirSortat, *arbInt, *prec, *lengths;
	int n, m = 1;

	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);

	scanf("%d", &n);

	sir = (int*) calloc(n + 1, sizeof(int));
	sirSortat = (int*) calloc(n + 1, sizeof(int));
	prec = (int*) calloc(n + 1, sizeof(int));
	lengths = (int *) calloc(n + 1, sizeof(int));

	for(int i = 1; i <= n; i++)
	{
		scanf("%d", sir + i);
		sirSortat[i] = sir[i];
	}

	sort(sirSortat  + 1, sirSortat + n + 1);
	for(int i = 2; i <= n; i++)
		if(sirSortat[i] != sirSortat[i-1])
			sirSortat[++m] = sirSortat[i];

	arbInt = (int*) calloc(4 * m + 1, sizeof(int));

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

	int imax = 0;

	for(int i = 1; i <= n; i++)
	{
		prec[i] = sir[i] > 1 ?interogate(arbInt, 1, sir[i] - 1, 1, 1, m, lengths) : 0;
		lengths[i] = lengths[prec[i]] + 1;
		modify(arbInt, sir[i], i, 1, 1, m, lengths);
		if(lengths[i] > lengths[imax])
			imax = i;
	}

	printf("%d\n", lengths[imax]);
	printData(imax, sir, sirSortat, prec);
	printf("\n");

	return 0;
}