Cod sursa(job #2511288)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 18 decembrie 2019 18:17:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

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

int v[100005], n;
vector <int> p, q;

void citire() {
    fin >> n;
    for(int i = 0; i < n; i++)
        fin >> v[i];
}

int cb(int st, int dr, int x) {
    if(!q.size() || x > q[q.size()-1])  {
        q.push_back(x);
        return q.size()-1;
    }
    if(q[0]>=x) {
        q[0] = x;
        return 0;
    }

    /*while(dr-st-1 > 0) {
        int m = (st+dr)/2;
        if(q[m] < x) st = m+1;
        else if(q[m] > x) dr = m-1;
        else {
            q[m] = x;
            return m;
        }
    }*/
    while(dr-st-1 > 0) {
        int m = (st+dr)/2;
        if(q[m] < x) st = m;
        else dr = m;
    }
    q[dr] = x;
    return dr;
}

void solve() {
    for(int i = 0; i < n; i++) {
        int poz = cb(0, q.size()-1, v[i]);
        ///cout<< "cb " << v[i] << "="<< poz << '\n';
        p.push_back(poz);
    }
}

void afis() {
    fout << q.size() << '\n';
    int s[100005], k = p.size()-1;
    for(int i = q.size()-1; i >= 0; i--) {
        while(p[k] != i)
            k--;
        s[i] = v[k];
    }
    for(int i = 0; i < q.size(); i++)
        fout << s[i] << ' ';
}


int main() {
    citire();
    solve();
    afis();
}