Cod sursa(job #1484293)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 10 septembrie 2015 19:18:47
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

#define last_bit(x) (x&(-x))

using namespace std;

const int Nmax = 100010;

int n , i , ans;
int a[Nmax] , bst[Nmax] , aib[Nmax];
vector < int > Norm , v;

void aibUpdate(int i , int x)
{
    for ( ; i <= n; i += last_bit(i))
        aib[i] = max(aib[i] , x);
}

int aibQuery(int i)
{
    int ret = 0;

    for ( ; i ; i -= last_bit(i))
        ret = max(ret , aib[i]);

    return ret;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scamx.out","w",stdout);

    scanf("%d", &n);

    for (i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
        Norm.push_back(a[i]);
    }

    sort(Norm.begin() , Norm.end());
    auto it = unique(Norm.begin() , Norm.end());
    Norm.resize(distance(Norm.begin() , it));

    for (i = 1; i <= n; ++i)
        a[i] = lower_bound(Norm.begin() , Norm.end() , a[i]) - Norm.begin() + 1;

    for (i = 1; i <= n; ++i)
    {
        bst[i] = aibQuery(a[i] - 1) + 1;
        aibUpdate(a[i] , bst[i]);

        ans = max(ans , bst[i]);
    }

    for (i = n; i ; --i)
        if (bst[i] == ans)
        {
            v.push_back(a[i]);
            ans--;
        }

    for (printf("%d\n", v.size()); v.size(); v.pop_back())
        printf("%d ", Norm[v.back()]);

    return 0;
}