Cod sursa(job #2574709)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 6 martie 2020 09:07:38
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 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");

unsigned 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, Q[N_MAX];
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++)
    {
        Q[i] = Query(a[i]) + 1;
        Update(a[i], Q[i]);
    }

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

    fout << mx << "\n";

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

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

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