Cod sursa(job #2552338)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 20 februarie 2020 19:29:34
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, lmax, nr;
int v[100001], sol[100001], want[100001];

void copySol() {
    for (int i = 1; i <= lmax; i++)
        sol[i] = v[i];
}

int main() {
    fin >> n;
    for (int i = 1; i <= n; i++) {
        fin >> nr;

        int st = 1, dr = lmax;
        while (st < dr) {
            int m = (st + dr + 1) / 2;
            if (nr >= v[m])
                st = m;
            else
                dr = m - 1;
        }

        if (lmax == 0) {
            lmax++;
            v[lmax] = nr;
            copySol();
        } else {
            while (nr > v[st] && st < lmax)
                st++;

            if (st != lmax)
                while (want[st] && st < lmax)
                    st++;

            if (st == lmax)
                for (int i = lmax; i >= 1 && want[i] != 0; i--) {
                    v[i] = want[i];
                    want[i] = 0;
                }

            if (nr > v[st]) {
                lmax++;
                v[lmax] = nr;
                copySol();
            } else {
                want[st] = nr;
            }
        }
    }

    fout << lmax << '\n';
    for (int i = 1; i <= lmax; i++)
        fout << sol[i] << ' ';
    return 0;
}