Cod sursa(job #2731164)

Utilizator handicapatucavasi eduard handicapatu Data 27 martie 2021 13:57:12
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int n;
int v[100001] , dp[100001] , ind[100001] , ans[100001];

int next_pos(int x , int k){
    int start = 1;
    int finish = k;
    int pos = 0;
    while(start <= finish){
        int m = (start + finish) / 2;
        if(dp[m] > x){
            finish = m - 1;
            pos = m;
        }
        else start = m + 1;
    }
    return pos;
}
int main()
{
    f>>n;
    for(int i = 1; i <= n; ++i){
        f>>v[i];
    }
    int k = 1;
    dp[1] = v[1];
    ind[1] = 1;
    for(int i = 2 ; i <= n ; ++i){
        if(v[i] > dp[k]){
            dp[++k] = v[i];
            ind[i] = k;
        }
        else{
            int pos = next_pos(v[i] , k);
            dp[pos] = v[i];
            ind[i] = pos;
        }
    }
    g<<k<<endl;
    int j = n;
    for(int i = k ; i >= 1 ; --i){
        while(ind[j] != i){
            --j;
        }
        ans[i] = v[j];
    }
    for(int i = 1 ; i <= k ; ++i){
        g<<ans[i]<<" ";
    }
    return 0;
}