Cod sursa(job #2498957)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 24 noiembrie 2019 21:52:25
Problema Subsir crescator maximal Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <map>
#define NMAX 1025
#define ub(x) x & -x
using namespace std;

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

int v[NMAX], n, vmax, tata[NMAX];

map <int, int> aib;

void update(int x, int val)
{
    for (int i = x; i <= vmax; i += ub(i))
        if (aib.find(i) != aib.end()) aib[i] = max(val, aib[i]);
        else aib[i] = val;
}

int query(int x)
{
    int val = 0;
    for (int i = x; i; i -= ub(i))
        if (aib.find(i) != aib.end()) val = max(val, aib[i]);
    return val;
}

int main()
{
    int maxi = 0;
    fin >> n;
    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i];
        if (v[i] > vmax) vmax = v[i];
        int val = query(v[i] - 1) + 1;
        tata[val] = i;
        if (val > maxi) maxi = val;
        update(v[i], val);
    }
    fout << maxi << "\n";
    for (int i = 1; i <= maxi; ++i)
        fout << v[tata[i]] << " ";
    return 0;
}