Cod sursa(job #2360265)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 1 martie 2019 16:29:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 100001;
const int INF = 2000000001;

int a[MAXN];
int lastmin[MAXN];   //lastmin[i] = pozitia celui mai mic nr in care se termina un subsir crescator de lg i
int poz[MAXN];       //poz[i] = pozitia elementului care preceda pe a[i] in subsirul crescator de lg i
int N, lmax;

void citire() {
    in >> N;
    for(int i = 1; i <= N; ++i)
        in >> a[i];
}

int caut(int p, int u, int x) {
    //OBS: sirul a[lastmin[i]] este crescator!!! de aceea aplicam cautare binara pe sir screscator
    while(p <= u) {
        int m = (p + u) / 2;
        if(a[lastmin[m]] < x)
            p = m + 1;
        else
            u = m - 1;
    }
    return p - 1;
}

void subsir() {
    lmax = 1;
    a[0] = INF;
    for(int i = 0; i <= N; ++i)
        lastmin[i] = 0;
    lastmin[1] = 1;
    poz[1] = 0;
    for(int i = 2; i <= N; ++i) {
        int k = caut(1, lmax, a[i]);
        ++k;
        if(a[lastmin[k]] > a[i]) {
            poz[i] = lastmin[k - 1];
            lastmin[k] = i;
            lmax = max(lmax, k);
        }
    }
}

void tipar() {
    out << lmax << '\n';
    int stiva[lmax + 1], vf = 0;
    for(int i = lastmin[lmax]; i > 0; i = poz[i])
        stiva[++vf] = a[i];
    while(vf) {
        out << stiva[vf] << ' ';
        --vf;
    }
}

int main() {
    citire();
    subsir();
    tipar();
    return 0;
}