Cod sursa(job #2719540)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 9 martie 2021 22:46:53
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n;
int v[100100];
int p[100100];
int afisare[100100];
/// pe p fac cautarea binara
int ans;

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i ++)
    {
        fin >> v[i];
    }
    p[++ans] = v[1];
    afisare[1] = 1;
    for(int i = 2; i <= n; i ++)
    {
        if(v[i] > p[ans])
        {
            p[++ans] = v[i];
            afisare[ans] = i;
        }
        else
        {
            /// 4 10 7 9 5
            int st = 1, dr = ans;
            int poz = 0;
            while(st <= dr)
            {
                int mijloc = (st + dr) / 2;
                if(v[i] < p[mijloc])
                {
                    dr = mijloc - 1;
                    poz = mijloc;
                }
                else
                {
                    st = mijloc + 1;
                }
            }
            p[poz] = v[i];
            afisare[poz] = i;
        }
    }
    fout << ans << '\n';

    stack<int> stiva;
    int val = INT_MAX;
    for(int i = n; i >= 1; i --)
    {
        if(afisare[ans] == i && v[i] < val)
        {
            val = v[i];
            stiva.push(v[i]);
            ans--;
            if(ans == 0)
                break;
        }
    }
    while(!stiva.empty())
    {
        fout << stiva.top() << ' ';
        stiva.pop();
    }
    fout << '\n';
    return 0;
}