Cod sursa(job #1739340)

Utilizator borcanirobertBorcani Robert borcanirobert Data 9 august 2016 11:53:16
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <iostream>
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]);

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

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

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

  //  cout << dr << ' ' << lmax; cin.get();

    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 p = 0, mid, rez, r = dr;

    while ( p <= r )
    {
        mid = ( p + r ) / 2;

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

    return rez;
}