Cod sursa(job #2470318)

Utilizator mihailescu_eduardMihailescu Eduard-Florin mihailescu_eduard Data 8 octombrie 2019 23:43:36
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")

#include <bits/stdc++.h>

using namespace std;
#define lsb(x) (x&(-x))

static const int NMAX = 1e5+5;

int aib[NMAX];
int v[NMAX];
int unique_id[NMAX];
int previous[NMAX];
int sol[NMAX];
int n;

int query(int position)
{
    int  mx = 0;
    for(int i = position; i>= 1; i-=lsb(i))
    {
        mx = max(mx, aib[i]);
    }
    return mx;
}

void update(int position, int value)
{
    for(int i = position;i<=n; i+=lsb(i))
    {
        aib[i] = max(aib[i],value);
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    map<int,int> unique;
    for(int i = 1; i<=n; ++i)
    {
        cin >> v[i];
        unique[v[i]] = 0;
    }

    
    int k = 0;
    for(auto it = unique.begin(); it!= unique.end(); it++)
    {
        k++;
        unique[it->first] = k;
    }

    
    
    for(int i =1; i<=n; ++i)
    {
        // Gasesc suma cea mai mare pt elemente mai mici decat elem curent
        int max_length = query(unique[v[i]]-1);

        update(unique[v[i]],max_length + 1);
        sol[max_length+1] = v[i];
    }
    int sz = query(n);
    cout << sz << '\n';
    for(int i = 1; i<= sz;++i)
        cout <<sol[i] << " ";
    return 0;
}