Cod sursa(job #1251844)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 octombrie 2014 22:29:26
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

#define Nmax 100100

using namespace std;

int N, Solution, A[Nmax], Min[Nmax], Location[Nmax], DP[Nmax];

int binarySearch(int Value) {

    int i, Step;

    for(Step = 1; Step <= Solution; Step <<= 1);

    for(i = 0; Step; Step >>= 1)
        if(i + Step <= Solution && Min[i + Step] < Value)
            i += Step;

    return Location[i];

}
void Solve() {

    int i, position;

    Min[++Solution] = A[1];
    Location[1] = 1;
    DP[1] = 1;

    for(i = 2; i <= N; i++) {

        position = binarySearch(A[i]);

        DP[i] = DP[position] + 1;

        if(DP[i] > Solution || Min[DP[i]] > A[i])
            Min[DP[i]] = A[i],
            Location[DP[i]] = i;

        if(DP[i] > Solution)
            ++Solution;

        }

}
void Read() {

    ifstream in("scmax.in");
    in >> N;

    for(int i = 1; i <= N; i++)
        in >> A[i];

    in.close();

}
void Write() {

    ofstream out("scmax.out");
    out << Solution << '\n';

    for(int i = 1; i <= Solution; i++)
        out << Min[i] << ' ';

    out << '\n';
    out.close();

}
int main() {

    Read();
    Solve();
    Write();

    return 0;

}