Cod sursa(job #2267038)

Utilizator vlad6001Pintilie Vlad vlad6001 Data 23 octombrie 2018 10:28:23
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define MAX 2000000001
using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

int nr, v[100004], best[100004], poz[100004];
int pus, contor, i, val, final, sol[100004];

void cautare(int val)
{
    int st, dr, m;

    st = 1;
    dr = contor+1;
    best[contor+1] = MAX;
    while(st <= dr)
    {
        m = (st+dr)/2;
        if(best[m] > val && best[m-1] <= val)
        {
            poz[i] = m;
            best[m] = val;
            break;
        }
        else
        if(val > best[m])
        st=m+1;
        else
        dr=m-1;
    }
    if(best[contor+1] != MAX)
    contor++;
}


int main()
{
    cin >> nr;
    for(int i=1; i <= nr; i++)
    cin >> v[i];

    for(i=1; i <= nr; i++)
    {
        pus = 0;
        cautare(v[i]);
    }

    i = nr;
    val = contor;
    while(val != 0)
    {
        if(poz[i] == val)
        {
            final++;
            sol[final] = v[i];
            val--;
        }
        i--;
    }
    cout << final << '\n';
    for(int i=final; i > 0; i--)
    cout << sol[i] << ' ';
}