Cod sursa(job #1974353)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 27 aprilie 2017 13:43:52
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;
const int Nmax = 100005;
const int INF = 0x3f3f3f3f;
int DP[Nmax];
int dad[Nmax];
int index[Nmax];
int val[Nmax];
int lg = 1;

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

    ios::sync_with_stdio(false);
    memset(DP,INF,sizeof(DP));

    int N;
    scanf("%d", &N);
    for(int i = 1; i <= N; ++i)
        scanf("%d", &val[i]);

    for(int i = 1; i <= N; ++i) {
        int pz = lower_bound(DP + 1, DP + lg + 1, val[i]) - DP;
        DP[pz] = val[i];
        dad[i] = index[pz - 1];
        index[pz] = i;
        if(pz == lg)
            ++lg;
    }
    printf("%d\n", lg - 1);
    int crt = index[lg - 1];
    vector<int> sol;
    while(crt != 0) {
        sol.push_back(val[crt]);
        crt = dad[crt];
    }
    reverse(sol.begin(), sol.end());
    for(auto it : sol)
        printf("%d ",it);

    return 0;
}