Cod sursa(job #2028012)

Utilizator rangal3Tudor Anastasiei rangal3 Data 26 septembrie 2017 23:28:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#define in "scmax.in"
#define out"scmax.out"
#define N 100003

using namespace std;

ifstream fin(in);
ofstream fout(out);

int n,v[N],ant[N],s[N];// ant- pozitia elementului anterior, s- pozitia elementului din s
int ns;

inline int BS(int X)
{
    int st,dr,mij;
    st = 1;
    dr = ns;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        if(X <= v[s[mij]])
            dr = mij-1;
        else st = mij+1;
    }
    return st;
}

inline void afis(int nod)
{
    if(nod!=0)
    {
        afis(ant[nod]);
        fout<<v[nod]<<" ";
    }
}

void SCLM()
{
    int poz;
    for(int i=1; i<=n; ++i)
    {
        poz = BS(v[i]);
        ns = max(ns,poz);
        s[poz] = i;
        ant[i] = s[poz-1];
    }

    fout<<ns<<"\n";

    afis(s[ns]);
}

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

    SCLM();


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