Cod sursa(job #2323147)

Utilizator Carol_LucaCarol Luca Carol_Luca Data 18 ianuarie 2019 21:26:13
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
//#include <iostream>

#include <fstream>

using namespace std;



int n,v[100005],best[100005],previ[100005],maxim,k,end_list[100005],nr,poz,f[100005];

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 maxi=maxim;

    int x=poz;

    while(x>0){

        //cout<<v[x]<<" ";

        f[maxim--]=v[x];

        x=previ[x];

    }

    for(int i=1;i<=maxi;i++)

        cout<<f[i]<<" ";

    return 0;

}