Cod sursa(job #1472346)

Utilizator eu3neuomManghiuc Teodor-Florin eu3neuom Data 17 august 2015 00:49:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;

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

const int NMax = 1e5 + 5;

int nr = 1;
int v[NMax], best[NMax], L[NMax], go[NMax];

int bin_search(int x){
    int lo = 0;
    int hi = nr;
    int mid;
    while(lo <= hi){
        mid = (lo + hi) / 2;
        if(v[L[mid]] < x && v[L[mid + 1]] >= x){
            return mid;
        }
        if(v[L[mid + 1]] < x){
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }
    return nr;
}

void print(int i){
    if(go[i] != 0){
        print(go[i]);
    }
    fout << v[i] << " ";
}

int main() {
    int n, poz, maxim;
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    best[1] = L[1] = 1;
    for(int i = 2; i <= n; i++){
        poz = bin_search(v[i]);
        go[i] = L[poz];
        best[i] = poz + 1;
        L[poz + 1] = i;
        if(nr < poz + 1){
            nr = poz + 1;
        }
    }
    maxim = poz = 0;
    for(int i = 1; i <= n; i++){
        if(maxim < best[i]){
            maxim = best[i];
            poz = i;
        }
    }
    fout << maxim << "\n";
    print(poz);
    return 0;
}