Cod sursa(job #2573901)

Utilizator WladDalwMvladutu cristian vlad WladDalwM Data 5 martie 2020 19:21:00
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int aib[100005];
int d[100005];
int r[100005];

int n;

struct no
{
    int val , poz, no;
}v[100005];

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

int q(int poz)
{
    int maxim = 0;
    while(poz)
    {
        maxim = max(maxim , aib[poz]);
        poz -= len(poz);
    }
    return maxim;
}

int u(int poz , int val)
{

    while(poz <= n)
    {
        aib[poz] = max(aib[poz] , val);
        poz += len(poz);
    }
}

bool xort1(no a , no b)
{
    if(a.val < b.val)
        return true;
    return false;
}

void nor()
{
    int ac = 0;
    v[0].val = -1;
    for(int i = 1; i <= n; i++)
        {ac += (v[i - 1].val != v[i].val);
        v[i].no = ac;}
}

bool xort2(no a , no b)
{
    if(a.poz < b.poz)
        return true;
    return false;
}

int main()
{

    int i , best = 0 , rez , last;
    cin >> n;
    for(i = 1; i <= n; i++)
    {
        cin >> v[i].val;
        v[i].poz = i;
    }

    sort( v + 1, v + n + 1, xort1);
    nor();
    sort(v + 1, v + n + 1, xort2);

    for(i = 1; i <= n; i++)
    {
        d[i] = q(v[i].no - 1) + 1;
        best = max(best , d[i]);
        u(v[i].no , d[i]);
    }
    cout << best << '\n';
    rez = best;
    last = 0;
    v[last].val = 2000000005;
    for(i = n; i >= 1 && best; i--)
    {
        if(d[i] == best && v[i].val < v[last].val)
            r[best--] = v[i].val , last = i;
    }
    for(i = 1; i <= rez; i++)
        cout << r[i] << " ";

    return 0;
}