Cod sursa(job #2327756)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 24 ianuarie 2019 21:51:32
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 1e5+5;
int v[N],aux[N],fn[N],dp[N],poz[N],n,rez[N];
int query(int k)
{
    int Max = 0;
    while (k>0)
    {
        if (dp[fn[k]]>dp[Max])
            Max = fn[k];
        k-=k&-k;
    }
    return Max;
}
void update(int k, int val)
{
    while (k<=n)
    {
        if (dp[val]>dp[fn[k]])
            fn[k] = val;
        k+=k&-k;
    }
}

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