Cod sursa(job #1101036)

Utilizator 2dorTudor Ciurca 2dor Data 7 februarie 2014 20:56:54
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
using namespace std;

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

const int MAXN = 100005;
int best[MAXN], lung[MAXN];
int v[MAXN], N, sol;

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

int BinSearch(int nr) {
    int Left = 1; int Right = sol; int Middle;
    while (Right - Left > 1) {
        Middle = (Right - Left) / 2 + Left;
        if (best[Middle] > nr)
            Left = Middle;
        else
            Right = Middle;
    }
    if (best[Right] > nr) {
        if (best[Right + 1] < nr) {
            best[Right + 1] = nr;
            ++sol;
            return sol;
        }
    }else if (best[Left] > nr) {
        if (best[Right] < nr) {
            best[Right] = nr;
            return Left;
        }
    }
    if (best[1] < nr)
        best[1] = nr;
    return 1;
}

void Solve() {
    best[1] = v[N];
    lung[N] = 1;
    sol = 1;
    for (int i = N - 1; i; --i)
        lung[i] = BinSearch(v[i]);
}

void Write() {
    fout << sol << '\n';
    for (int i = 1; i <= N; ++i)
        if (lung[i] == sol) {
            --sol;
            fout << v[i] << ' ';
        }
}

int main() {
    Read();
    Solve();
    Write();
    fin.close();
    fout.close();
    return 0;
}