Cod sursa(job #635555)

Utilizator andreea29Iorga Andreea andreea29 Data 19 noiembrie 2011 13:10:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
using namespace std;
ifstream f("scmax.in");
ofstream h("scmax.out");


int n, v[100003], best[100003], p[100003], maxim, k, l[100003], nr;

void afis(int i)
{
	if (p[i] > 0)  
		afis(p[i]);
	h<<v[i]<<" ";
}

int caut(int x)
{
	int p, u, m;
	p = 0; 
	u = nr; 
	m = (p+u)/2;
	while (p <= u)
	{
		if ((v[l[m]] < x) &&  (v[l[m+1]] >= x)) 
			return m;
		else 
			if (v[l[m+1]] < x) 
			{
				p = m + 1; 
				m = (p + u)/2;
			}
			else 
			{
				u = m - 1; 
				m = (p + u)/2;
			}
	}
	return nr;
}

int main()
{

	int i, j, poz;
	nr = 1;

	f>>n;
	for (i = 1; i <= n; i++) 
		f>>v[i];
	best[1] = l[1] = 1; 
	l[0] = 0;

	for (i = 2; i <= n; i++)
	{
		poz = caut(v[i]);
		p[i] = l[poz];
		best[i] = poz + 1;
		l[poz + 1] = i;
		if (nr < poz + 1)  
			nr = poz + 1;
	}
	maxim = 0; 
	poz = 0;
	for (i = 1; i <= n; i++)
       if (maxim < best[i])
       {
          maxim = best[i]; 
		  poz = i;
       }
	h<<maxim<<'\n';
	afis(poz);
	f.close();
	h.close();
	return 0;   
}