Cod sursa(job #2280012)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 10 noiembrie 2018 10:59:36
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int a[100005], p[100005];
vector <int> e;
int n;

int cautBin(int x){
    int st=1, dr=e.size()-1;
    int mij;
    while(st<=dr){
        mij = (st+dr)/2;
        if(st == dr)
            return mij;
        if(e[mij] == x)
            return mij;
        if(e[mij] > x)
            dr = mij - 1;
        if(e[mij] < x)
            st = mij + 1;
    }
    return st;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d\n", &n);

    e.push_back(0);

    for(int i=0;i<n;++i){
        scanf("%d", &a[i]);
        if(e.back() < a[i])
            e.push_back(a[i]), p[i] = e.size() - 1;
        else{
            int poz = cautBin(a[i]);
            e[poz] = a[i];
            p[i] = poz;
        }
    }

    int l = e.size() - 1;

    int pc = n-1;

    vector <int> sol;

    cout<<l<<"\n";

    for(int i=0;i<l;++i){
        for(int j=pc;j>=0;--j){
            if(p[j] == l-i){
                sol.push_back(a[j]);
                pc = j-1;
                break;
            }
        }
    }

    //for(int i=0;i<n;++i)
        //cout<<p[i]<<" ";
    //cout<<"\n";

    for(int i=l-1;i>=0;--i)
        cout<<sol[i]<<" ";

    return 0;
}