Cod sursa(job #2355015)

Utilizator Paulet.StefanPauletStefan Paulet.Stefan Data 25 februarie 2019 19:09:56
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#define LMAX 1000005

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int a[LMAX], C[LMAX], poz[LMAX];
int n, lgc = 1;

int cautbinar(int x);

int main()
{
	int i, x, pozitia, elemcur;
    fin >> n;
    for (i = 1; i <= n; i ++)
		fin >> a[i];
    C[1] = a[1];
    poz[1] = 1;
	for (i = 2; i <= n; i ++)
	{
		x = a[i];
		if (x > C[lgc])
        {
            C[++ lgc] = x;
            poz[i] = lgc;
        }
		else
		{
			pozitia = cautbinar(x);
			C[pozitia] = x;
			poz[x] = pozitia;
		}
	}
	fout << lgc << '\n';
	elemcur = lgc;
	for (i = n; i >= 1; i --)
	{
		if (poz[i] == elemcur)
		{
			C[elemcur] = a[i];
			elemcur --;
		}
	}
	for (i = 1; i <= lgc; i ++)
		fout << C[i] << ' ';
    return 0;
}

int cautbinar(int x)
{
	int st, dr, mij;
	for (st = 0, dr = lgc + 1; dr - st > 1;)
	{
		mij = (st + dr) / 2;
		if (x > C[mij])
			st = mij;
		else
			dr = mij;
	}
	return dr;
}