Cod sursa(job #2765975)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 30 iulie 2021 16:43:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int p[100005], t[100005], dp[100005], d;
int n, k, v[100005];
int st, dr, md;

void go(int p){
    if(t[p] != -1)
        go(t[p]);
    fout<<v[p]<<" ";
}

int main (){
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>v[i];

    d=0;
    dp[0]=0;
    p[0]=-1;
    t[0]=-1;

    for(int i=1; i<=n; i++){
        k=v[i];

        st=0; dr=d;
        while(st <= dr){
            md=(st+dr)/2;
            if(k > dp[md])
                st=md+1;
            else
                dr=md-1;
        }

        if(st == d+1){
            d++;
            dp[d]=k;
            p[d]=i;
            t[i]=p[d-1];
        }else if(dp[st] > k){
            dp[st]=k;
            p[st]=i;
            t[i]=p[st-1];
        }
        /**
        cout<<d<<" "<<k<<"\n";
        for(int i=1; i<=d; i++)
            cout<<dp[i]<<" ";

        cout<<"\n\n";
        **/
    }

    fout<<d<<"\n";
    go(p[d]);
    return 0;
}