Cod sursa(job #2582523)

Utilizator vali_27Bojici Valentin vali_27 Data 16 martie 2020 20:49:05
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 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, t, elementMax;
    list <int> sir;

    // caut ultimul nr din SCLM
    t = n;
    while(t >= 1 && poz[t] != Lmax)t--;

    elementMax = v[t];
    Lmax--;
    sir.push_front(elementMax);

    // caut restul nr din SCLM
    while(t >= 1 && Lmax > 0)
    {
        if(poz[t] == Lmax && v[t] < elementMax)
        {
            Lmax--;
            elementMax = v[t];
            sir.push_front(elementMax);
        }
        t--;
    }

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

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

}


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