Cod sursa(job #1739328)

Utilizator borcanirobertBorcani Robert borcanirobert Data 9 august 2016 11:33:46
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
using namespace std;

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

const int MAX = 100005;
int N;
int a[MAX];
int l[MAX];
int best[MAX];
int p[MAX];
int lmax, poz;
int dr;
int scmax[MAX];
int c;

void Read();
void Solve();
void Sir( int poz );
int Cauta( int nr );

int main()
{
    Read();
    Solve();

    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    int i;

    fin >> N;
    for ( i = 1; i <= N; i++ )
        fin >> a[i];
}

void Solve()
{
    int i;

    best[1] = l[1] = 1; dr = 1;
    for ( i = 2; i <= N; i++ )
    {
        int pos = Cauta(a[i]);

        best[i] = pos + 1;
        l[pos + 1] = i;
        p[i] = l[pos];

        if ( dr < pos + 1 ) dr = pos + 1;
    }

    for ( i = 1; i <= N; i++ )
        if ( best[i] > lmax )
        {
            lmax = best[i];
            poz = i;
        }

    Sir(poz);

    fout << lmax << '\n';
    for ( i = 1; i <= lmax; i++ )
        fout << scmax[i] << ' ';
}

void Sir( int poz )
{
    if ( p[poz] > 0 )
        Sir(p[poz]);
    scmax[++c] = a[poz];
}

int Cauta( int nr )
{
    int st = 0, mid, rez;

    while ( st <= dr )
    {
        mid = ( st + dr ) / 2;

        if ( a[l[mid]] < nr )
        {
            rez = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }

    return rez;
}