Cod sursa(job #1819184)

Utilizator AlexnolifeAlexandru Ica Alexnolife Data 30 noiembrie 2016 12:44:24
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
#include<iostream>

using namespace std;

#define MAX 100001

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

int a[MAX], b[MAX], poz[MAX];
int n,m;

void citire()
{
    int i;

    fin >> n;

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

int caut(int p, int u, int x)
{
    int m;

    while(p <= u)
    {
        m = p + (u - p) / 2;

        if(x < a[b[m]])
            p = m + 1;
        else
            u = m - 1;
    }
}

void subsir()
{
    int i, j, k;

    a[0] = 1234567890;

    for(i = n; i >= 1; i--)
    {
        poz[i] = 0;

        k = caut(1, m, a[i]);

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

            if(a[b[k]] < a[i])
                b[k] = i;
        }
    }
}

void tipar()
{
    int i;

    g << m << endl;

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

    g << a[i] << ' ';
}

int main()
{
    citire();
    subsir();
    tipar();
    fin.close();

    return 0;
}