Cod sursa(job #2241172)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 15 septembrie 2018 10:37:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 1e5+5;

int n,v[NMAX],res[NMAX],lst[NMAX],dp[NMAX],fn[NMAX],up[NMAX];

int query(int x)
{
    int Max = 0;
    while (x>0)
    {
        if (dp[fn[x]]>dp[Max])
            Max = fn[x];
        x-=x&-x;
    }
    return Max;
}

void update(int k, int x)
{
    while (x<=n)
    {
        if (dp[k]>dp[fn[x]])
            fn[x] = k;
        x+=x&-x;
    }
}

int main()
{
    in >> n;
    for (int i = 1; i<=n; i++)
    {
        in >> v[i];
        res[i] = lst[i] = v[i];
    }
    sort(lst+1,lst+n+1);
    int h = 1;
    for (int i = 2; i<=n; i++)
        if (lst[i]!=lst[h])
            lst[++h] = lst[i];
    for (int i = 1; i<=n; i++)
        v[i] = lower_bound(lst+1,lst+h+1,v[i])-lst;
    for (int i = 1; i<=n; i++)
    {
        up[i] = query(v[i]-1);
        dp[i] = dp[up[i]]+1;
        update(i,v[i]);
    }
    int best = 0;
    for (int i = 1; i<=n; i++)
        if (dp[best]<dp[i])
            best = i;
    out << dp[best] << "\n";
    h = 0;
    for (int i = best; i>0; i = up[i])
        lst[++h] = res[i];
    for (int i = h; i>0; i--)
        out << lst[i] << " ";
}