Cod sursa(job #1089735)

Utilizator alex03mihaimihai alexandru alex03mihai Data 21 ianuarie 2014 21:40:12
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#define NMAX 10000

using namespace std;

FILE * fin = fopen("scmax.in", "r");
FILE * fout = fopen("scmax.out", "w");

void citire();
void pd();
void constr_sol();
void afisare();
int binar(int, int, int);

int n, a[NMAX];
int best[NMAX];
int poz[NMAX];
int lgmax, sir[NMAX];
int main()
{
	citire();
	pd();
	constr_sol();
	afisare();
	return 0;
}

void citire()
{
	int i;
	fscanf(fin, "%d", &n);
	for (i = 1; i <= n; i ++)
		fscanf(fin, "%d", &a[i]);
}

void pd()
{
	int i, j, st, dr, mij, pozitie;
	best[1] = a[1];
	poz[1] = 1;
	for (i = 2; i <= n; i ++)
	{
		if (a[i] > best[lgmax])
		{
			best[++lgmax] = a[i];
			poz[i] = lgmax;
		}
		else
		{
			pozitie = binar(a[i], 0, lgmax+1);
			best[pozitie] = a[i];
			poz[i] = pozitie;
		}
	}
}

int binar(int x, int st, int dr)
{
	int mij;
	while (st <= dr)
	{
		mij = (dr - st)/2 + st;
		if (best[mij] < x)
			st = mij;
		if (x < best[mij])
			dr = mij;
		if (best[mij] == x)
			return mij;
	}
	return dr;
}

void constr_sol()
{
	int i, j, x;
	x = lgmax;
	for (i = n; i > 0; i -- )
		if (poz[i] == x)
		{
			sir[x] = a[i];
			x --;
		}
}

void afisare()
{
	int i;
	fprintf(fout, "%d\n", lgmax);
	for (i = 1; i <= lgmax; i ++)
		fprintf(fout, "%d ", sir[i]);
	fprintf(fout, "\n");
}