Cod sursa(job #2365973)

Utilizator qwerty1234qwerty qwerty1234 Data 4 martie 2019 17:45:51
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb

#include <bits/stdc++.h>


using namespace std;

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

const int Nmax = 1e5 + 5;

int a[Nmax], n, lis[Nmax], k, P[Nmax] , sol[Nmax] , d;


int main()
{
    int L, R, m, poz;
    fin >> n;
    for(int i = 1 ; i <= n ; i++)
        fin >> a[i];
    k = 1;
    lis[k] = a[1];
    P[1] = 1;
    for(int i = 2 ; i <= n ; i++)
        if(a[i] > lis[k])
        {
            lis[++k] = a[i];
            P[i] = k;
        }
        else if(a[i] <= lis[1])
        {
            lis[1] = a[i];
            P[i] = 1;
        }
        else
        {
            L = 1;
            R = k;
            while(L <= R)
            {
                m = (L + R) / 2;
                if(lis[m] >= a[i])
                    poz = m, R = m - 1;
                else L = m + 1;
            }
            lis[poz] = a[i];
            P[i] = poz;
        }
    int ans = 0 , x;
    for(int i = 1 ; i <= n ; i++)
        ans = max(ans, P[i]);
    fout << ans << "\n";
    x = 2e9 + 1;
    for(int i = n ; i >= 1 ; i--)
        if(P[i] == ans && x > a[i])
    {
        x = a[i];
        sol[++d] = a[i];
        --ans;
    }
    for(int i = d ; i >= 1 ; i--)
        fout << sol[i] << " ";
    fout << "\n";
    fin.close();
    fout.close();
    return 0;
}