Cod sursa(job #2568265)

Utilizator TigoanMateiTigoan Matei-Daniel TigoanMatei Data 3 martie 2020 21:44:38
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");

int n, poz, maxim, ii;
int v[100001], pred[100001], lmax[100001], sol[100001], ind[100001];

int main()
{
    in >> n;
    for(int i = 1; i <= n; ++ i)
        in >> v[i];
    for(int i = 1; i <= n; ++ i)
    {
        if(v[i] > sol[maxim])
        {
            ++maxim;
            lmax[i] = maxim;
            sol[maxim] = v[i];
            ind[maxim] = i;
            pred[i] = ind[maxim - 1];
        }
        else
        {
            poz = 0;
            for(int j = (1<<20); j > 0; j /= 2)
                if(poz + j <= maxim && sol[poz + j] < v[i])
                    poz += j;
            ++poz;
            sol[poz] = v[i];
            ind[poz] = i;
            pred[i] = ind[poz - 1];
            lmax[i] = lmax[pred[i]] + 1;
        }
//        for(int k = 1; k <= lmax[i]; ++ k)
//            cout << sol[k] << " ";
//        cout << " " << lmax[i];
//        cout << '\n';
        maxim = max(maxim, lmax[i]);
    }
    maxim = 0;
    for(int i = 1; i <= n; ++ i)
        if(lmax[i] > maxim)
        {
            maxim = lmax[i];
            poz = i;
        }
    out << maxim << '\n';
    while(poz > 0)
    {
        sol[maxim - ii] = v[poz];
        ii++;
        poz = pred[poz];
    }
    for(int i = 1; i <= maxim; ++ i)
        out << sol[i] << " ";
    return 0;
}