Cod sursa(job #2320632)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 14 ianuarie 2019 22:49:43
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>

#define MAXN 100004

using namespace std;

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

int dp[MAXN], v[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 (dp[it + step] < val)
                it += step;
        }
    }
    return it;
}

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

    dp[1] = v[1]; nn = 1;

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

inline void Write(int nn) {
    fout << nn << "\n";
    for (int i = 1; i <= nn; i++)
        fout << dp[i] << " ";
}

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

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