Cod sursa(job #2335482)

Utilizator ciutanpCiuta Andrei Calin ciutanp Data 4 februarie 2019 10:20:28
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include<bits/stdc++.h>
#define NMAX 100005
using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

int v[NMAX],tat[NMAX],l[NMAX],dp[NMAX];

int n,nr=1,poz;

int unde(int x)
{
    int st=0,dr=nr,m=(st+dr)/2;
    while(st<=dr)
    {
        if(v[l[m]]<x && x<=v[l[m+1]])
            return m;
        else if(v[l[m+1]]<x)
        {
            st=m+1;
        } else dr=m-1;
        m=(st+dr)/2;
    }
    return nr;
}
void afis(int carepecare)
{
    if(tat[carepecare]>0)
        afis(tat[carepecare]);
    g<<v[carepecare]<<' ';

}

int main()
{
    f>>n;
    for(int i=1;i<=n;++i)
        f>>v[i];
    dp[1]=l[1]=1;
    l[0]=0;
    for(int i=2;i<=n;++i)
    {
        poz=unde(v[i]);
        tat[i]=l[poz];
        dp[i]=poz+1;
        l[poz+1]=i;
        if(poz+1>nr)
            nr=poz+1;
    }
    int sol=0;
    poz=0;
    for(int i=1;i<=n;++i)
        if(dp[i]>sol)
    {
        sol=dp[i];
        poz=i;
    }
    g<<sol<<'\n';
    afis(poz);
}