Cod sursa(job #2306957)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 23 decembrie 2018 13:41:06
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("munte.in");
ofstream fout ("munte.out");
const int NMAX = 100003;
const int INF = 2000000003;
int n, poz, ret, k;
int v [NMAX], M [NMAX], prevv [NMAX];
int CB (int X){
    int st = 1, dr = NMAX - 3;
    while (st <= dr){
        int mij = (st + dr) / 2;
        if (X <= v [M [mij]])
            dr = mij - 1, ret = mij;
        else st = mij + 1;
    }
    return ret;
}
void func (int poz){
    if (prevv [poz] > 0)func (prevv [poz]);
    fout << v [poz] << " ";
}
int main(){
    fin >> n; v [n + 1] = INF;
    memset (M, n + 1, sizeof M);
    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';
    func (M [k]);
    return 0;
}