Cod sursa(job #2320657)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 14 ianuarie 2019 23:26:03
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

#define MAXN 100004

using namespace std;

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

int dp[MAXN], v[MAXN], dad[MAXN];

inline void Read(int &N) {
    fin >> N;

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

inline int BinarySearch(int val, int nn) {
    int step, it;

    for (step = 1; step <= nn; step <<= 1);

    for (it = 0; step; step >>= 1) {
        if (it + step <= nn) {
            if (v[dp[it + step]] < val)
                it += step;
        }
    }
    return it;
}

inline void Dinamica(int N, int &nn) {
    int poz;

    dp[1] = 1; nn = 1; dad[1] = 0;

    for (int i = 2; i <= N; i++) {
        poz = BinarySearch(v[i], nn);
        dp[poz + 1] = i;
        dad[i] = dp[poz];
        nn = max(poz + 1, nn);
    }
}

inline void Write(int poz) {
    if (poz > 0) {
        Write(dad[poz]);
        fout << v[poz] << " ";
    }
}

int main () {
    int N, nn;
    Read(N);
    Dinamica(N, nn);

    fout << nn << "\n";

    Write(dp[nn]);

    fin.close(); fout.close(); return 0;
}