Cod sursa(job #2202779)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 9 mai 2018 21:00:36
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
//http://www.infoarena.ro/problema/scmax       Subsir crescator maximal

#include <bits/stdc++.h>

using namespace std;

ifstream f ("scmax.in");
ofstream g ("scmax.out");

const int NMAX = 1e5 + 5;
int n, m = 1;
int v[NMAX], capat[NMAX], poz[NMAX], sol[NMAX];

void binSearch(int val, int i) {
    int lo = 1;
    int hi = m;
    int mid;
    int ret = -1;

    while(lo <= hi) {
        mid = lo + (hi - lo) / 2;
        if(capat[mid] < val) {
            ret = mid;
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }

    if(ret == m) {
        ++m;
    }
    capat[ret + 1] = val;
    poz[i] = ret + 1;
}

int main() {
    f >> n;
    for (int i = 1; i <= n; ++i) {
        f >> v[i];
        binSearch(v[i], i);
    }

    int ans = m;
    for(int i = n; ans > 1; --i) {
        if(poz[i] == ans) {
            sol[ans] = v[i];
            --ans;
        }
    }

    g << m - 1 << '\n';
    for(int i = 2; i <= m; ++i) {
        g << sol[i] << ' ';
    }

    f.close();
    g.close();
    return 0;
}