Cod sursa(job #2460978)

Utilizator adiaioanaAdia R. adiaioana Data 24 septembrie 2019 19:29:54
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#define NM 100100

using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");

int sir[NM], P[NM], v[NM], poz, lgm, pm, lg[NM], N, ls;

void scan();
int caut(int x);
void print(int k);

int main()
{
    scan();

    lg[1]=1;
    sir[1]=1;
    P[1]=0;ls=1;
    for(int i=2; i<=N; ++i)
    {
        poz=caut(v[i]);
        lg[i]=poz+1;
        P[i]=sir[poz];
        sir[poz+1]=i;
        if(lg[i]>lgm)
            lgm=lg[i], pm=i;
        if(poz+1>ls)
            ls=poz+1;
    }

    cout<<lgm<<'\n';
    print(pm);
    return 0;
}

void scan()
{
    cin>>N;
    for(int i=1; i<=N; ++i)
        cin>>v[i];
}

int caut(int x)
{
    int st=0, dr=ls, mij=0;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[sir[mij]]<x &&v[sir[mij+1]]>=x)
            return mij;
        else if(v[sir[mij+1]]<x)
            st=mij+1;
        else dr=mij-1;
    }
    return ls;
}

void print(int k)
{
    if(P[k])
        print(P[k]);
    cout<<v[k]<<' ';
}