Cod sursa(job #2724909)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 18 martie 2021 01:59:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define lsb(i) ((i ^ (i - 1)) & i)

using namespace std;

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

const int N_MAX = 1e5 + 5;

int N, x;
vector < pair < int, int > > v;

int nor[N_MAX], cnt = 1;

int BIT[N_MAX], Q[N_MAX];

unordered_map < int, int > MP;

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

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

int main()
{
    fin >> N;
    for (int i = 1; i <= N; i++)
    {
        fin >> x;
        v.push_back(make_pair(x, i));
    }

    sort(v.begin(), v.end());
    for (int i = 0; i < N; i++)
    {
        int pos = v[i].second;
        int val = v[i].first;

        if (i > 0 && v[i - 1].first != val)
            cnt++;

        nor[pos] = cnt;
        MP[cnt] = val;
    }

    for (int i = 1; i <= N; i++)
    {
        Q[i] = Query(nor[i] - 1) + 1;
        Update(nor[i], Q[i]);
    }

    int mx = 0;
    vector < int > Ans;
    for (int i = 1; i <= N; i++)
        mx = max(mx, Q[i]);
    for (int i = N; i >= 1; i--)
        if (Q[i] == mx)
        {
            Ans.push_back(MP[nor[i]]);
            mx--;
        }
    reverse(Ans.begin(), Ans.end());
    fout << Ans.size() << "\n";
    for (int i = 0; i < Ans.size(); i++)
        fout << Ans[i] << " ";
    return 0;
}