Cod sursa(job #1015971)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 25 octombrie 2013 15:12:22
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#define nmax 100005
using namespace std;

int Q[nmax], P[nmax], a[nmax];
int n;

ofstream fout("scmax.out");
void citire()
{
    ifstream fin("scmax.in");
    fin >> n;

    for (int i = 1; i <= n; i++)
        fin >> a[i];
}

int cautare_binara(int st, int dr, int x)
{
    int mijl = (st+dr)/2;
    if (st > dr)
        return st;
    if (x < Q[mijl])
        return cautare_binara(st, mijl-1, x);
    if (x > a[mijl])
        return cautare_binara(mijl+1, dr, x);
}
void rezolvare()
{
    for (int i = 1; i <= n; i++)
    {
        /// P[i] = pozitia lui a[i] in Q
        P[i] = cautare_binara(1, Q[0], a[i]);

        if (P[i] > Q[0] || a[i] > Q[Q[0]])
            P[i] = ++Q[0];
        Q[P[i]] = a[i];
    }
}

void afisare(int i, int indx)
{
    while (i >= 1 && indx >= 1)
    {
        if (P[i] == indx)
        {
            afisare(i-1,indx-1);
            fout << a[i] << ' ';
            return;
        }
        i--;
    }
}
int main()
{
    citire();
    rezolvare();
    fout << Q[0] << '\n';
    afisare(n, Q[0]);
    return 0;
}