Cod sursa(job #2254319)

Utilizator dianamariaDiana Cataros dianamaria Data 4 octombrie 2018 23:32:19
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define dim 100002
#define inf 2000000001
using namespace std;

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

int v[dim], p[dim], q[dim],l, n;
vector <int> ans;

bool cmp(int a, int b)
{
    return (a > b);
}

int insereaza(int val, int st, int dr)
{
    int mij = (st + dr) / 2;
    if (st == dr)
    {
        if (dr > l)
            q[++l + 1] = inf;
        q[st] = val;
        return st;
    }
    else
        if (val < q[mij])
            return insereaza(val, st, mij);
        else
            if (val > q[mij])
                return insereaza(val , mij + 1, dr);
}

int main()
{
    in >> n;
    for (int i = 1; i <= n; i++)
        in >> v[i];
    l = 0;
    q[1] = inf;
    for (int i = 1; i <= n; i++)
        p[i] = insereaza(v[i], 1, l + 1);
    out << l << '\n';
    for (int i = l; i; i--)
    {
        while (p[n] != i)
            n--;
        ans.push_back(v[n]);
    }
    sort(ans.begin(), ans.end(), cmp);
    for (int i = l - 1; i >= 0; i--)
        out << ans[i] << " ";
    return 0;
}