Cod sursa(job #1646861)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 10 martie 2016 18:01:26
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

#define lastbit(x) (x&(-x))

using namespace std;

const int Nmax = 1e5 + 10;

int n , i , ans , last;
int a[Nmax] , bst[Nmax] , aib[Nmax];

vector < int > Norm , v;

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

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

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

    return ret;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.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] = query(a[i] - 1) + 1;
        ans = max(ans , bst[i]);

        update(a[i] , bst[i]);
    }

    last = n + 1; a[n+1] = n + 1; bst[n+1] = ans + 1;
    for (i = n; i ; --i)
    {
        if (bst[i] + 1 != bst[last] || a[i] >= a[last])
            continue;

        v.push_back(Norm[a[i]-1]);
        last = i;
    }

    printf("%d\n", ans);
    for (auto it = v.rbegin(); it != v.rend(); ++it)
        printf("%d ", *it);

    return 0;
}