Cod sursa(job #1810011)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 19 noiembrie 2016 15:16:16
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <unordered_map>

using namespace std;

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

const int nMax = 100005;

unsigned int v[nMax];
unsigned int a[nMax];
unordered_map<int, int> m;
int n;
unsigned int ant[nMax];

const unsigned int INF = (1 << 31);

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

void afisare(int x)
{
    if(ant[x] != 0)
        afisare(ant[x]);
    out << m[x] << " ";
}

void normalize()
{
    for(int i = 1; i <= n; ++i)
        v[i] = a[i];
    sort(v + 1, v + n + 1);
    unsigned int tmp;
    for(int i = 1; i <= n; ++i)
    {
        tmp = a[i];
        a[i] = lower_bound(v + 1, v + n + 1, a[i]) - v;
        m[a[i]] = tmp;
    }
}

void rezolvare()
{
    normalize();
    for(int i = 1; i <= n; ++i)
        v[i] = 0;
    unsigned int mx;
    unsigned int x;
    for(int i = 1; i <= n; ++i)
    {
        mx = 0;
        for(int j = 1; j < a[i]; ++j)
        {
            if(v[j] > mx)
            {
                mx = v[j];
                ant[a[i]] = j;
            }
        }
        v[a[i]] = max(v[a[i]], mx + 1);
    }
    mx = 0;
    int sol;
    for(int i = 1; i <= n; ++i)
    {
        if(v[i] > mx)
        {
            mx = v[i];
            sol = i;
        }
    }
    out << mx << "\n";
    afisare(sol);
}

int main()
{
    citire();
    rezolvare();
}