Cod sursa(job #2334525)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 2 februarie 2019 18:09:46
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <limits.h>

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

int n, i, j, m, maxim, poz, st, dr, mid, v[100005], d[100005], tata[100005];

inline int print (int a){
    if (a){
        print (tata[a]);
        fout << v[a] << " ";
    }
}

int main()
{
    fin >> n;
    for (i=1; i<=n; i++){
        fin >> v[i];
    }
    m = 1;
    d[1] = 1; // l[i] = pozitia celei mai mici valoari in care se poate termina un sir de lungime i, folosind elementele deja parcurse
    for (i=2; i<=n; i++){
        // caut binar pozitia ultimei valori l[poz] din L pentru care v[i] > v[l[poz]]
        // st ramane pe pozitia primei valori mai mari sau egale cu ce caut
        // dr ramane pe pozitia ultimei valori strict mai mici decat ce caut
        st = 1, dr = m;
        while (st <= dr){
            mid = st + (dr - st)/2;
            if (v[d[mid]] >= v[i]){
                dr = mid - 1;
            }
            else{
                st = mid + 1;
            }
        }
        if (st > m){
            m++;
            d[m] = i;
        }
        else{
            d[st] = i;
        }
        tata[i] = d[st-1]; // vector de tati
    }
    fout << m << "\n";
    print (d[m]);
    return 0;
}

/** recapitulare **/
// O(N*logN)