Cod sursa(job #2511831)

Utilizator MichaelXcXCiuciulete Mihai MichaelXcX Data 19 decembrie 2019 20:25:25
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int N, V[NMAX], best[NMAX], pre[NMAX], maxim, k, L[NMAX], nr;

void afis(int i)
{
    if(pre[i] > 0)
        afis(pre[i]);

    fout << V[i] << " ";
}

int cauta(int x)
{
    int st, dr, mid;
    st = 0;
    dr = nr;
    mid = (st + dr) / 2;

    while(st <= dr) {
        if(V[L[mid]] < x && V[L[mid+1]] >= x)
            return mid;

        else if(V[L[mid + 1]] < x) {
            st = mid + 1;
            mid = (st + dr) / 2;
        }

        else {
            dr = mid - 1;
            mid = (st + dr) / 2;
        }
    }

    return nr;
}

int main()
{
    int poz;
    nr = 1;

    fin >> N;
    for(int i = 1; i <= N; i++)
        fin >> V[i];

    best[1] = L[1] = 1;
    L[0] = 0;

    for(int i = 2; i <= N; i++) {
        poz = cauta(V[i]);
        pre[i] = L[i];
        best[i] = poz + 1;
        L[poz + 1] = i;
        if(nr < poz + 1)
            nr = poz + 1;
    }

    maxim = 0;
    poz = 0;

    for(int i = 1; i <= N; i++)
        if(maxim < best[i]) {
            maxim = best[i];
            poz = i;
        }

    fout << maxim << "\n";
    afis(poz);
}