Cod sursa(job #2316612)

Utilizator NashikAndrei Feodorov Nashik Data 12 ianuarie 2019 00:00:42
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
//#include <iostream>
#include <fstream>
using namespace std;

int n,v[100005],best[100005],previ[100005],maxim,k,end_list[100005],nr,poz;
int caut_iterativ(int x)
{
    int st,dr,m;
    st=0;
    dr=nr;
    m=(st+dr)/2;
    while(st<=dr){
        if(v[end_list[m]]<x and v[end_list[m+1]]>=x)
            return m;
        else
            if(v[end_list[m+1]]<x){
                st=m+1;
                m=(st+dr)/2;
            }
            else{
                dr=m-1;
                m=(st+dr)/2;
            }
    }
    return nr;
}
int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    nr=1;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    best[1]=end_list[1]=1;
    end_list[0]=0;
    for(int i=2;i<=n;i++){
        poz=caut_iterativ(v[i]);
        previ[i]=end_list[poz];
        best[i]=poz+1;
        end_list[poz+1]=i;
        if(nr<poz+1)
            nr=poz+1;
    }
    maxim=0;
    poz=0;
    for(int i=1; i<=n; i++)
        if(maxim<best[i]){
            maxim=best[i];
            poz=i;
        }
    cout<<maxim<<"\n";
    int x=poz;
    while(x>0){
        cout<<v[x]<<" ";
        x=previ[x];
    }
    return 0;
}