Cod sursa(job #2279961)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 10 noiembrie 2018 10:39:07
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector <int> s1, s2, sir;

int n;

int BinSearch(int st, int dr, int nr){

    if(st == dr){
        if(s1[st] >= nr)
            return st;
        return -1;
    }
    int mij = (st + dr) / 2;
    if(s1[mij] < nr)
        return BinSearch(mij + 1, dr, nr);
    else
        return BinSearch(st, mij + 1, nr);
}
void construct(int x){
    int poz = BinSearch(1, s1.size() - 1, x);

    if(poz == -1){
        s1.push_back(x);
        s2.push_back(s1.size() - 1);
    }
    else{
        s1[poz] = x;
        s2.push_back(poz);
    }
}

int main() {

    ios::sync_with_stdio(false);

    in >> n;
    int x;
    in >> x;
    sir.push_back(0);
    sir.push_back(x);

    s1.push_back(0);
    s1.push_back(sir[1]);
    s2.push_back(0);
    s2.push_back(1);

    for(int i = 1; i < n; i++){
        in >> x;
        sir.push_back(x);
        construct(x);
    }
    out << s1.size() - 1 << "\n";

    vector <int> sol;
    int len = s1.size() - 1;

    for(int i = n; i > 0; i--){
        if(s2[i] == len){
            sol.push_back(sir[i]);
            len --;
        }
    }

    for(int i = sol.size() - 1; i >= 0; i--)
        out << sol[i] << " ";

    return 0;
}