Cod sursa(job #2289833)

Utilizator Cristi01052Tudorache Christian Cristi01052 Data 25 noiembrie 2018 13:23:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>

using namespace std;

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

int a[100005], n, lg[100005], tata[100005], sol[100005];

void f(int id)
{
    int st = 1, dr = lg[0];
    while(st <= dr)
    {
        int mid = (st+dr)/2;
        if(a[lg[mid]] >= a[id])
            dr = mid - 1;
        else
            st = mid + 1;
    }
    if(dr == lg[0])
    {
        lg[0]++;
        lg[lg[0]] = id;
    }
    else
        if(a[id] < a[lg[dr+1]])
            lg[dr+1] = id;
    if(dr == 0)
        tata[id] = 0;
    else
        tata[id] = lg[dr];
}

int main()
{
    cin>>n;
    for(int i = 1; i <= n; ++i)
        cin>>a[i];
    for(int i = 1; i <= n; ++i)
        f(i);
    cout<<lg[0]<<"\n";
    int poz = lg[lg[0]];
    while(poz > 0)
    {
        sol[0]++;
        sol[sol[0]] = a[poz];
        poz = tata[poz];
    }
    for(int i = sol[0]; i >= 1; --i)
        cout<<sol[i]<<" ";
    return 0;
}