Cod sursa(job #2569360)

Utilizator gheorghe_cristiGheorghe Florin Cristi gheorghe_cristi Data 4 martie 2020 11:55:22
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, u, p, m;
int v[100005];
int L[100005];
int T[100005];

void sol(int i) {
    if (i) {
        sol(T[i]);
        fout << v[i] << " ";
    }
}

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

    m =  1; /// lungimea subsirului
    L[1] = 1;
    for (int i=2;i<=n;++i) {
        p = 1; /// st
        u = m; /// dr


        /// caut pozitia urmatoarei valori mai mari decat a ultimei din subsir
        while(p<=u) {
            int mid = p+(u-p)/2;
            if (v[ L[mid] ] >= v[i])
                u = mid - 1;
            else
                p = mid + 1;
        }

        if (p > m) { /// a gasit, o pune in subsir
            m++;
            L[m] = i;
            T[i] = L[p-1];
        } else { /// o updateaza
            L[p] = i;
            T[i] = L[p-1];
        }
    }

    fout<<m<<"\n";
    sol(L[m]);
}