Cod sursa(job #2520456)

Utilizator thedorbulacovschittrter thedorbulacovschi Data 9 ianuarie 2020 14:17:42
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#define INF 2000000999
#include <stack>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int dp[100005];
int pdp[100005];///pozitia acelui element din dp
int v[100005];
int pv[100005];///peste ce element din vector este pus

int n,i,lgmax;
int st,dr,mijl;

stack <int> a;

int main()
{
    fin>>n;
    for(i=1;i<=n+1;i++){
        dp[i]=INF;
    }
    for(i=1;i<=n;i++){
        fin>>v[i];
        st=0;
        dr=n+1;
        while(st<=dr){
            mijl=(st+dr)/2;
            if(dp[mijl]<v[i] && dp[mijl+1]>=v[i]){
                dp[mijl+1]=v[i];
                pdp[mijl+1]=i;
                pv[i]=pdp[mijl];
                break;
            }
            else if(dp[mijl]>=v[i]){
                dr=mijl-1;
            }
            else{
                st=mijl+1;
            }
        }
    }
    for(i=1;i<=n+1;i++){
        if(dp[i]==INF){
            lgmax=i-1;
            break;
        }
    }
    fout<<lgmax<<'\n';
    i=pdp[lgmax];
    while(i!=0){
        a.push(v[i]);
        i=pv[i];
    }
    while(!a.empty()){
        fout<<a.top()<<" ";
        a.pop();
    }
    return 0;
}