Cod sursa(job #1821856)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 3 decembrie 2016 19:26:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int nMax = 100005;
ifstream in("scmax.in");
ofstream out("scmax.out");

int n;
int v[nMax];
int dp[nMax];
int last[nMax];
int rasp;

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

void rezolvare()
{
    int pos;
    dp[1] = v[1];
    rasp = 1;
    for(int i = 2; i <= n; ++i)
    {
        pos = lower_bound(dp + 1, dp + rasp + 1, v[i]) - dp;
        dp[pos] = v[i];
        rasp = max(pos, rasp);
        last[i] = pos;
    }
}

void afisare()
{
    out << rasp << "\n";
    int t = rasp;
    for(int i = n; i > 0; --i)
    {
        if(last[i] == t)
        {
            dp[t] = v[i];
            --t;
        }
    }
    for(int i = 1; i <= rasp; ++i)
        out << dp[i] << " ";
}

int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}