Cod sursa(job #2542732)

Utilizator Bogdy_PPrunescu Bogdan Bogdy_P Data 10 februarie 2020 15:46:44
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int nr, a[100003], L[100003], m, n, best[100003], poz, p[100003];
int caut(int x)
{
    int p = 0, u = nr;
    int m = (p + u) / 2;
    while(p <= u)
    {
        if(a[L[m]] < x && a[L[m + 1]] >= x) return m;
        else
        {
            if(a[L[m + 1]] < x) p = m + 1;
            else u = m - 1;
            m = (p + u) / 2;
        }
    }
    return nr;
}
void afis(int i)
{
    if(p[i] > 0) afis(p[i]);
    out << a[i] << " ";
}
int main()
{
    in >> n;
    nr = 1;
    for(int i = 1;i <= n;i++)
        in >> a[i];
    best[1] = L[1] = 1;
    L[0] = 0;
    for(int i = 2;i <= n;i++)
    {
        poz = caut(a[i]);
        p[i] = L[poz];
        best[i] = poz + 1;
        L[poz + 1] = i;
        if(nr < poz + 1) nr = poz + 1;
    }
    int maxim = 0;
    poz = 0;
    for(int i = 1;i <= n;i++)
        if(maxim < best[i])
    {
        maxim = best[i];
        poz = i;
    }
    out << maxim << '\n';
    afis(poz);
    return 0;
}