Cod sursa(job #1454565)

Utilizator CollermanAndrei Amariei Collerman Data 26 iunie 2015 21:21:03
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream> // varianta 2 - O(N*logN) (26.06.2015)
#include <algorithm>
using namespace std;
ofstream fout("scmax.out");
ifstream fin("scmax.in");
const int MMAX = 100001;

int n, lg, p;
int sir[MMAX], lista[MMAX], poz[MMAX];

void lis()
{
    for(int i=1; i<=n; i++)  {
        p = upper_bound(lista + 1, lista + lg + 1, sir[i]) - lista;
        if(sir[i] == lista[p-1]) p--;
        lista[p] = sir[i];
        poz[i] = p;
        if(p > lg) lg = p;
    }
    fout << lg << '\n';
}

void traceback()
{
    int yolo = 0;

    for(int i=n; i; i--)
        if(poz[i] == lg) {
            lista[++yolo] = sir[i];
            lg--;
        }

    for(int i=yolo; i; i--)
        fout << lista[i] << ' ';
}

int main()
{
    fin >> n;
    for(int i=1; i<=n; i++) fin >> sir[i];

    lis();
    traceback();

    fin.close();
    fout.close();
    return 0;
}