Cod sursa(job #1044869)

Utilizator vladm97Matei Vlad vladm97 Data 30 noiembrie 2013 15:51:41
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>

using namespace std;

int n,l;
int p[100010];
int q[100010];
int input[100010];
int output[100010];
ifstream in("scmax.in");
ofstream out("scmax.out");

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

int bsc(int element)
{
    int left = 1;
    int right = l;
    int middle;
    while(left < right)
    {
        middle = (left + right) / 2;
        if(q[middle] >= element)
        {
            right = middle - 1;
        }
        else
        {
            left = middle + 1;
        }
    }
    return right;
}

int includeIt(int pos)
{
    if(input[pos] > q[l])
    {
        q[++l] = input[pos];
        return l;
    }
    else
    {
        int aux = bsc(input[pos]);
        q[aux] = input[pos];
        return aux;
    }
}

void selectAll()
{
    for(int i=1; i<=n; i++)
    {
        p[i] = includeIt(i);
    }
}

int schEl(int element,int position)
{
    for(int i = position; i>=1; i--)
    {
        if(p[i] == element)
        {
            return i;
        }
    }
}

void getOutput()
{
    int position = n;
    for(int i=l; i>=1; i--)
    {
        position = schEl(i,position);
        output[i] = input[position];
    }
}

void solve()
{
    selectAll();
    getOutput();
}

void write()
{
    out<<l<<"\n";
    for(int i=1; i<=l; i++)
    {
        out<<output[i]<<" ";
    }
}

main()
{
    read();
    solve();
    write();
}