Cod sursa(job #2002466)

Utilizator dumitrescu_andreiDumitrescu Andrei dumitrescu_andrei Data 19 iulie 2017 22:58:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <cmath>
#include <algorithm>

#define NMax 100005
using namespace std;

int n,k,lo,hi,mij,poz;
int sol[NMax],a[NMax],R[NMax];

int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");
    f >> n;
    for(int i = 1; i <= n; ++i)
        f >> a[i];
    k = 0;
    sol[k] = 0;
    for(int i = 1; i <= n; ++i){
        if(a[i] > sol[k]){
            ++k;
            sol[k] = a[i];
            R[i] = k;
        }else{
            lo = 1;
            hi = k;
            poz = k;
            while(lo <= hi){
                mij = (lo + hi) / 2;
                if(sol[mij] >= a[i]){
                    poz = mij;
                    hi = mij - 1;
                }else{
                    lo = mij + 1;
                }
            }
            sol[poz] = a[i];
            R[i] = poz;
        }
    }
    g << k <<'\n';
    int lg = 0;
    for(int i = n; i >= 1 && k; --i){
        if(R[i] == k){
            k--;
            sol[++lg] = a[i];
        }
    }
    for(int i = lg; i >= 1; --i)
        g << sol[i] <<" ";
    return 0;
}