Cod sursa(job #1020838)

Utilizator angelaAngela Visuian angela Data 2 noiembrie 2013 18:29:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <iomanip>
using namespace std;
const int Dim = 100001;

ifstream is("scmax.in");
ofstream os("scmax.out");

int a[Dim], n, L;
int Ind[Dim];
int P[Dim];

void Read();
void Write(int k);
int Din();
int BS(int i, int st, int dr);

int main()
{
    Read();
    for (int i = 1; i <= n; ++i )
    {
        int j = BS(i, 1, L);

        P[i] = Ind[j];
        if (j == L or a[i] < a[Ind[j+1]])
        {
            Ind[j+1] = i;
            L = max(L, j + 1);
        }
    }

    os << L << '\n';
    Write(Ind[L]);

    is.close();
    os.close();
    return 0;
}

int BS(int i, int st, int dr)
{
    int m;
    bool ok = false;
    while ( st <= dr )
    {
        m = (st + dr) / 2;
        if ( a[Ind[m]] < a[i] )
            st = m + 1, ok = true;
        else
            dr = m - 1;
    }
    return ok ? dr : 0;
}

void Read()
{
    is >> n;
    for ( int i = 1; i <= n; ++i )
        is >> a[i];
}

void Write(int k)
{
    if ( !k ) return;
    Write(P[k]);
    os <<a[k] << ' ';
}