Cod sursa(job #2948388)

Utilizator matei.tudoseMatei Tudose matei.tudose Data 27 noiembrie 2022 17:51:58
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <stack>
using namespace std;

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

struct elem
{
    int lungMax, nod;
} BIT[100005];

stack<int> ans;
int n, numbers[100005], indexes[100005], tata_de[100005];

int getLSB(int x)
{
    return (x & (-x));
}

void setValue(int x, int poz)
{
    int cPoz = poz;
    for (; cPoz <= n; cPoz += getLSB(cPoz))
    {
        if (BIT[cPoz].lungMax < x)
        {
            BIT[cPoz].lungMax = x;
            BIT[cPoz].nod = poz;
        }
    }
}

elem getValue(int poz)
{
    elem ans = {0, 0};
    for (; poz > 0; poz -= getLSB(poz))
    {
        if (ans.lungMax < BIT[poz].lungMax)
            ans = BIT[poz];
    }
    return ans;
}

bool compareIndexes(int x, int y)
{
    return numbers[x] < numbers[y];
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
    {
        fin >> numbers[i];
        indexes[i] = i;
        if (i > 1 && numbers[i] == numbers[i-1])
            i--, n--;
    }
    sort(indexes + 1, indexes + 1 + n, compareIndexes);
    for (int i = 1; i <= n; i++)
    {
        if (i == 1)
        {
            setValue(1, indexes[i]);
            continue;
        }
        elem ans = getValue(indexes[i] - 1);
        tata_de[indexes[i]] = ans.nod;
        setValue(ans.lungMax + 1, indexes[i]);
    }
    fout << BIT[n].lungMax << "\n";
    int header = BIT[n].nod;
    while (header)
    {
        ans.push(numbers[header]);
        header = tata_de[header];
    }
    while (!ans.empty())
    {
        fout << ans.top() << " ";
        ans.pop();
    }
    fout << "\n";
    return 0;
}