Cod sursa(job #1612277)

Utilizator BugirosRobert Bugiros Data 24 februarie 2016 19:32:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
using namespace std;

const int MAXN = 100005;

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

const int INF = 1 << 30;

int v[MAXN];
int n;
int minim[MAXN];//minim[i] - minimul unui subsir de lungime i
int pozpunere[MAXN];

int raspuns = 0;


void citire()
{
    in >> n;
    for (int i = 1;i <= n;++i)
        in >> v[i];
}

int cautare_binara(int x)
{
    int poz = 0;
    for (int pas = 1 << 17;pas >= 1;pas >>= 1)
        if (poz + pas <= raspuns && minim[poz + pas] < x)
            poz += pas;
    return poz;
}

void prelucrare()
{
    for (int i = 1;i <= n;++i)
        minim[i] = INF;

    for (int i = 1;i <= n;++i)
    {
        int poz = cautare_binara(v[i]);
        if (poz == raspuns)
            ++raspuns;
        minim[poz + 1] = v[i];
        pozpunere[i] = poz + 1;
    }
}


void afisare()
{
    out << raspuns << '\n';
    int s[MAXN] = {0};
    int ls = raspuns;
    for (int i = n;i >= 1;--i)
        if (pozpunere[i] == ls)
        {
            s[ls] = i;
            --ls;
        }
    for (int i = 1;i <= raspuns;++i)
        out << v[s[i]] << ' ';
    out << '\n';
}

int main()
{
    citire();
    prelucrare();
    afisare();
    return 0;
}