Cod sursa(job #2306964)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 23 decembrie 2018 13:58:28
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int NMAX = 100005;
const int INF = 2000000005;
int n, poz, ret, k, ind = 1, l;
int v [NMAX], M [NMAX], prevv [NMAX], ans [NMAX];
int CB (int X){
    int st = 1, dr = NMAX - 4;
    while (st <= dr){
        int mij = (st + dr) / 2;
        if (X <= v [M [mij]])
            dr = mij - 1, ret = mij;
        else st = mij + 1;
    }
    return ret;
}
int main(){
    fin >> n; v [n + 1] = INF;
    for (int i = 1; i <= NMAX - 3; i ++)M [i] = n + 1;
    for (int i = 1; i <= n; i ++)fin >> v [i];
    for (int i = 1; i <= n; i ++){
        poz = CB (v [i]);
        M [poz] = i;
        prevv [i] = M [poz - 1];
    }
    for (int i = 1; i <= n + 1; i ++)
        if (M [i] == n + 1){k = i - 1; break;}
    fout << k << '\n'; ind = M [k];
    while (ind != 0)ans [++ l] = ind, ind = prevv [ind];
    for (int i = k; i >= 1; i --)fout << v [ans [i]] << " ";
    return 0;
}