Cod sursa(job #2574684)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 6 martie 2020 08:44:45
Problema Subsir crescator maximal Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define N_MAX 100005
#define lsb(i) ((i & (i - 1)) ^ i)

using namespace std;

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

int N, a[N_MAX], Val[N_MAX];
pair < int, int > v[N_MAX];

map < int, int > Poz;

int BIT[N_MAX];

void Update(int poz, int val)
{
    for (int i = poz; i <= N; i += lsb(i))
        BIT[i] = max(BIT[i], val);
}

int Query(int poz)
{
    int ret = 0;
    for (int i = poz; i > 0; i -= lsb(i))
        ret = max(ret, BIT[i]);
    return ret;
}

int mx, poz;
vector < int > Ans;

int main()
{
    fin >> N;
    for (int i = 1; i <= N; i++)
    {
        fin >> v[i].first;
        v[i].second = i;
        Val[i] = v[i].first;
    }

    sort(v + 1, v + N + 1);

    for (int i = 1; i <= N; i++)
        Poz[v[i].first] = i;

    for (int i = 1; i <= N; i++)
        a[i] = Poz[Val[i]];

    for (int i = 1; i <= N; i++)
        Update(a[i], Query(a[i] - 1) + 1);

    for (int i = 1; i <= N; i++)
        mx = max(mx, BIT[i]);

    fout << mx << "\n";
    for (int i = N; i >= 1; i--)
        if (Query(a[i]) == mx && (poz == 0 || a[poz] > a[i]))
        {
            poz = i;
            mx--;
            Ans.push_back(v[a[i]].first);
        }

    reverse(Ans.begin(), Ans.end());

    for (int val: Ans)
        fout << val << " ";
    return 0;
}