Cod sursa(job #1121250)

Utilizator lucianRRuscanu Lucian lucianR Data 25 februarie 2014 12:11:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <fstream>
#define N_MAX 100001
#define INF 1561816

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");

int n, a[N_MAX], b[N_MAX], rec[N_MAX], m;

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

int search(int lo, int hi, int x)
{
    while(lo <= hi)
    {
        int m = lo + (hi - lo) / 2;
        if(x < a[b[m]])
            lo = m + 1;
        else hi = m - 1;
    }
    return lo;
}

void scmax()
{
    b[1] = 1;
    for(int i = n; i >= 1; i--)
    {
        int k = search(1, m, a[i]);
        if(k > m)
        {
            m = k;
            b[m] = i;
            rec[i] = b[k - 1];
        }
        else
        {
            rec[i] = b[k - 1];
            if(a[i] > a[b[m]])
                b[k] = i;
        }
    }
}

void print()
{
    out << m << '\n';
    for(int i = b[m]; i > 0; i = rec[i])
        out << a[i] << " ";
}

int main()
{
    read();
    scmax();
    //cout << a[b[m]] << " " << a[rec[b[m]]];
    print();
    return 0;
}