Cod sursa(job #2013736)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 22 august 2017 11:28:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#define nmax 100002
using namespace std;
fstream f1("scmax.in", ios::in);
fstream f2("scmax.out", ios::out);
long int n, v[nmax], lung[nmax], s[nmax], sol[nmax], lmax;
///s[i]=cel mai mic el din v ce termina o secv strict cresc de lung i
//lung[i]= lung maxima secv strict cresc ce se termina cu el v[i]
///lmax= lungime secv strict cresc maximala
void citire()
{
    long int i;
    f1>>n;
    for(i=1; i<=n; i++)
        f1>>v[i];
}
long int cauta(long int st, long int dr, long int val)
{
    if(st<=dr)
    {
        long int mijl=(st+dr)/2;
        if(val<=s[mijl]) return cauta(st, mijl-1, val);
        else return cauta(mijl+1, dr, val);
    }
    else return st;
}
void solutie()
{
    long int i;
    for(i=1; i<=n; i++)
        if(v[i]> s[lmax])
        {
            lmax++;
            s[lmax]=v[i];
            lung[i]=lmax;
        }
        else
        {
            lung[i]=cauta(1, lmax, v[i]);
            s[lung[i]]=v[i];
        }
}
void afisare()
{
    long int i, j=lmax;
    f2<<lmax<<"\n";
    for(i=n; (i>=1)&&(j); i--)
        if(j==lung[i]) {sol[j]=v[i]; j--;}

    for(i=1; i<=lmax; i++)
       f2<<sol[i]<<" ";
}
int main()
{
    citire();
    solutie();
    afisare();
    return 0;
}