Cod sursa(job #1912770)

Utilizator FredyLup Lucia Fredy Data 8 martie 2017 10:35:35
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 100010
int n,ini[lim],dp[lim],dad[lim],lmax;


/// caut cel mai din dreapta indice cu valoarea < val
int b_s(int val)
{
    int pos,mask;
    for(mask=1; mask<=lmax; mask<<=1);
    pos=0;
    for(; mask; mask>>=1)
        if(pos+mask<=lmax)
            if(ini[dp[pos+mask]]<val)
                pos+=mask;
    return pos;
}


void drum(int k)
{
    if(dad[k]) drum(dad[k]);
    fout<<ini[k]<<' ';
}


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

    ini[0]=(1<<30);

    for(int i=1; i<=n; i++)
    {
        pos=b_s(ini[i]);
        lmax=max(lmax,pos+1);
        dp[pos+1]=i;
        dad[i]=dp[pos];
    }

    fout<<lmax<<'\n';
    drum(dp[lmax]);

    fin.close();
    fout.close();
    return 0;
}