Cod sursa(job #2051648)

Utilizator gapdanPopescu George gapdan Data 29 octombrie 2017 13:14:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#define NMAX 100005

using namespace std;

int poz[NMAX], L[NMAX], v[NMAX];
int n;

int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> v[i];
    }
    poz[1] = 1;
    L[1] = v[1];
    int lg = 1;
    for (int i = 2; i <= n; ++i) {
        if (v[i] > L[lg]) {
            ++lg;
            poz[i] = lg;
            L[lg] = v[i];
        }
        else {
            //cautam pozitia unde sa-l inseram
            int st = 1, dr = lg, lastPoz = lg;
            while (st <= dr) {
                int mij = (st + dr) / 2;
                if (L[mij] >= v[i]) {dr = mij - 1; lastPoz = mij;}
                    else st = mij + 1;
            }
            L[lastPoz] = v[i];
            poz[i] = lastPoz;
        }
    }

    cout <<lg << "\n";
    int j = 0;
    for (int i = n; i > 0 && lg > 0; --i) {
        if (poz[i] == lg) {
            --lg;
            L[++j] = v[i];
        }
    }
    for (int i = j; i > 0; --i) {
        cout << L[i] << " ";
    }
    return 0;
}