Cod sursa(job #2282043)

Utilizator LivcristiTerebes Liviu Livcristi Data 13 noiembrie 2018 09:24:14
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <iostream>
#define NUM 100005
using namespace std;
int v[NUM];
int indice_fin[NUM];
int indice_prec[NUM];
int n, lng;
ifstream f("scmax.in");
ofstream g("scmax.out");
void citire()
{
    f >> n;
    for(int i = 0; i < n; ++i)
        f >> v[i];
}
void afisare(int indic)
{
    if(indice_prec[indic] >= 0)
        afisare(indice_prec[indic]);
    //cout << indic << " ";
    g << v[indic] << " ";
}
int ceil_poz(int st, int dr, int val)
{
    int mij;
    while(dr - st > 1)
    {
        mij = st + (dr - st) / 2;
        if(v[indice_fin[mij]] >= val)
            dr = mij;
        else
            st = mij;
    }
    return dr;
}
void solve()
{
    for(int i = 0; i <= n; ++i)
        indice_fin[i] = 0, indice_prec[i] = -1;
    lng = 1;
    int poz;
    for(int i = 1; i < n; ++i)
    {
        // daca e mai mic decat primul element
        if(v[i] < v[indice_fin[0]])
            indice_fin[0] = i;
        // daca e mai mare decat ultimul element
        else if(v[i] > v[indice_fin[lng - 1]])
        {
            indice_prec[i] = indice_fin[lng - 1];
            indice_fin[lng++] = i;
        }
        // il punem undeva in mijloc
        else
        {
            poz = ceil_poz(0, lng - 1, v[i]);
            indice_prec[i] = indice_fin[poz - 1];
            indice_fin[poz] = i;
        }
    }
    g << lng << "\n";
}
int main()
{
    citire();
    solve();
    afisare(indice_fin[lng - 1]);
}