Cod sursa(job #3173621)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 23 noiembrie 2023 13:31:39
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

#define N_MAX 100005

using namespace std;

ifstream fin("scmax.in");

ofstream fout("scmax.out");

int AIB[N_MAX];

int a[N_MAX], b[N_MAX], copie[N_MAX];

int recon[N_MAX], retrace[N_MAX];

int n;

void update(int x, int p)
{
    for (int i = x; i <= n; i += (i & (-i)))
        AIB[i] += p;
}

int query(int x)
{
    int rez = 0;
    for (int i = x; i; i -= (i & (-i)))
        rez += AIB[i];
    return rez;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
    {
        int x;
        fin >> x;
        a[i] = b[i] = copie[i] = x;
    }
    /// normalizare
    sort(copie + 1, copie + n + 1);
    int x = 0;
    for (int i = 1; i <= n; i++)
    {
        if (copie[x] != copie[i])
            copie[++x] = copie[i];
    }
    for (int i = 1; i <= n; i++)
    {
        b[i] = lower_bound(copie + 1, copie + x + 1, b[i]) - copie;
    }
    for (int i = 1; i <= n; i++)
    {
        retrace[i] = query(b[i] - 1);
        recon[i] = recon[retrace[i]] + 1;
        update(b[i], i);
    }
    int ultimul = 0;
    for (int i = 1; i <= n; i++)
        if (recon[ultimul] < recon[i])
            ultimul = i;
    int j;
    for (j = 0; ultimul; ultimul = retrace[ultimul])
    {
        copie[++j] = a[ultimul];
    }
    fout << j << '\n';
    for (; j; j--)
    {
        fout << copie[j] << " ";
    }
}