Cod sursa(job #1904748)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 5 martie 2017 19:17:53
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMax = 100005;
const int inf = 0x3f3f3f3f;

int N, a[NMax], b[NMax], poz[NMax];
int drr;

void Read()
{
    scanf("%d", &N);

    for(int i=1; i<=N; ++i)
        scanf("%d", &a[i]);
}

int BinSea(int st, int dr, int x)
{
    int m;
    while(st<=dr)
    {
        m=st+(dr-st)/2;

        if(x<a[b[m]])
            st = m+1;

        else
            dr = m-1;
    }

    return st;
}

void SCMAX()
{
    a[0]=inf;

    for(int i=N; i>=1; --i)
    {
        poz[i]=0;
        int k=BinSea(1,drr,a[i]);

        if(k>drr)
        {
            poz[i]=b[k-1];
            drr=k;
            b[k]=i;
        }

        else
        {
            poz[i]=b[k-1];
            if(a[b[k]] < a[i])
            {
                b[k]=i;
            }
        }
    }
}

void Print()
{
    cout<<drr<<"\n";

    for(int i=b[drr]; i>0; i=poz[i])

        cout<<a[i]<<" ";
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    Read();
    SCMAX();
    Print();
    return 0;
}