Cod sursa(job #1356492)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 23 februarie 2015 14:14:52
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
#include <algorithm>
#define NMAX 100023
#define inf 2000000023
FILE *fin, *fout;
int n, v[NMAX], poz, dr = 0, maxn, p;
struct ceva
{
	int val;
	int tata;
	int pos;
} arr[NMAX], d[NMAX], temp;
bool comp(ceva a, ceva b)
{
	return (a.val <= b.val);
}
void afisare(int a)
{
	if(a == 0) return;
	afisare(arr[a-1].tata);
	printf("%d ", v[a-1]);
}
int main()
{
	fin = freopen("scmax.in", "r", stdin);
	fout = freopen("scmax.out", "w", stdout);
	scanf("%d", &n);
	for(int i = 0; i< n; i++) scanf("%d", &v[i]);
	for(int i = 0; i< n; i++) d[i].val = inf;
	for(int i = 0; i< n; i++)
	{
		temp.val = v[i];
		poz = std::upper_bound(d, d+dr, temp, comp) - d;
		dr = poz+1;
		d[poz].val = v[i];
		d[poz].pos = i+1;
		if(poz == 0) d[poz].tata = 0;
		else d[poz].tata = d[poz-1].pos;
		arr[i].val = poz+1;
		arr[i].tata = d[poz].tata;
	}
	for(int i = 0; i< n; i++)
	{
		if(arr[i].val > maxn)
		{
			maxn = arr[i].val;
			p = i+1;
		}
	}
	printf("%d\n", maxn);
	afisare(p);
	fclose(fin);
	fclose(fout);
	return 0;
}