Cod sursa(job #2582513)

Utilizator vali_27Bojici Valentin vali_27 Data 16 martie 2020 20:34:43
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;

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

int v[NMAX],sclm[NMAX],n,L,poz[NMAX];

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


int cauta(int st,int dr,int val)
{
    if(st == dr)return st;
    else
    {
        int mid = (st + dr)/2;
        if(val < sclm[mid])
            return cauta(st,mid,val);
        else /* val >= sclm[mid] */
            return cauta(mid+1,dr,val);
    }
}

void sol()
{
    for(int i=1;i<=n;++i)
    {
        if(L == 0 || v[i] > sclm[L])
        {
            L++;
            sclm[L] = v[i];
            poz[i] = L;
        }
        else
        {
            int p = cauta(1,L,v[i]);
            sclm[p] = v[i];
            poz[i] = p;
        }
    }

    int Lmax = L;
    list <int> sir;

    for(int i = n; i >= 1; --i)
        if(poz[i] == Lmax)
        {
            Lmax--;
            sir.push_front(v[i]);
        }

    g << sir.size() << '\n';

    for(int i : sir)g << i << ' ';

}


int main()
{
    citire();
    sol();
}