Cod sursa(job #1163276)

Utilizator SRaduRadu Szasz SRadu Data 1 aprilie 2014 11:52:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <cstdio>
#include <iostream>

using namespace std;

const int MAX = 100050;

int N;

int A[MAX], Prev[MAX];

vector<int> V;

int getPosition(int X) {
    int poz, N = V.size(), step;
    for(step = 1; step <= N; step <<= 1);
    for(poz = -1; step; step >>= 1) {
        if(poz + step >= N) continue;
        if(V[poz + step] < X)
            poz += step;
    } 
    return poz;
}

void OpenFiles() {
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
}

void CloseFiles() {
    fclose(stdin);
    fclose(stdout);
}

void Afisare(int ind, int poz) {
    if(!poz || !ind) return;
    for(; ind && A[ind] != poz; ind--);
    Afisare(ind - 1, Prev[ind]);
    cout << A[ind] << " ";
}

int main() {
    OpenFiles();
    cin >> N; 
    for(int i = 1, poz; i <= N; i++) {
        cin >> A[i];
        poz = getPosition(A[i]);
        if(poz != -1)
            Prev[i] = V[poz];
        if(++poz == V.size())
            V.push_back(A[i]);
        else 
            V[poz] = min(V[poz], A[i]);
    }
    cout << V.size() << "\n";
    Afisare(N, V.back());
    CloseFiles();
}