Cod sursa(job #1015967)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 25 octombrie 2013 15:09:24
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#define nmax 100005
#define inf 1 << 30
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 inserare_binara(int st, int dr, int x)
{
    int mijl = (st+dr)/2;
    if (st == dr)
    {
        if (dr > Q[0]) Q[++Q[0]+1] = inf;
        Q[st] = x;
        return st;
    }
    if (x < Q[mijl])
        return inserare_binara(st, mijl, x);
    else return inserare_binara(mijl+1, dr, x);
}
void rezolvare()
{
    Q[1] = inf;
    for (int i = 1; i <= n; i++)
    {
        /// P[i] = pozitia lui a[i] in Q
        P[i] = inserare_binara(1, Q[0]+1, 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;
}