Cod sursa(job #2254317)

Utilizator dianamariaDiana Cataros dianamaria Data 4 octombrie 2018 23:27:45
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#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;

/*int insereaza()
{
    int pas = 1;
    while (pas <= l)
        pas *= 2;
    int r = 1;
    while (pas > 0)
    {
        if ( pas + r <= l && v[q[pas + r]] < val)
            r += pas;
        pas /= 2;
    }
    int poz = 0;
    if (i >= 2 || v[q[1]] < val)
        poz = r;
    q[poz + 1] = i;
    p[i] = q[j];
}*/

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]);
    }
    for (int i = l - 1; i >= 0; i--)
        out << ans[i] << " ";
    return 0;
}