Cod sursa(job #1293112)

Utilizator vladia13Ungureanu Adrian vladia13 Data 15 decembrie 2014 13:01:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<iostream>
#include<fstream>
#define nmax 100009

using namespace std;

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

int v[nmax],q[nmax],p[nmax],n,L,sol[nmax];

void read()
{

    in >> n;
    for(int i = 1 ; i <= n ; i++)
        in >> v[i];
    in.close();
}

int bin_search(int val,int left,int right)
{

    int mij;
    while(left <= right)
    {
        mij = (left + right)/2;

        if(val > q[mij])
            left = mij + 1;
        else
            right = mij - 1;
    }
    if(left > L)
    {
        q[++L] = val;
        return left;
    }
    else {
        q[left] = val;
        return left;
    }
}

void buildPQ()
{
    q[1] = v[1];
    p[1] = 1;
    L = 1;
    for(int i = 2 ; i <= n ; i++)
    {
        p[i] = bin_search(v[i],1,L);
    }
}

void build_sol()
{
    int i,k = n;
    for(i = L; i ; i--)
    {
        while(p[k] != i) k--;
        sol[i] = v[k];
    }
}

void write_sol()
{
    out << L << "\n";
    for(int i = 1 ; i <= L ; i++)
        out << sol[i] << " ";
    out.close();
}

int main()
{

    read();
    buildPQ();
    build_sol();
    write_sol();

    return 0;
}