Cod sursa(job #1043803)

Utilizator MarghescuGabriel Marghescu Marghescu Data 28 noiembrie 2013 22:42:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
 
int n, a[100002],b[100002], c[100002], lmax;
 
int cb(int a[], int b[], int p, int q, int v)
{
    int mij;
    while (p<=q)
    {
        mij=p+(q-p)/2;
        if (v<a[b[mij]]) p=mij+1;
        else q=mij-1;
    }
    return p;
}
 
int main()
{
    int i,l;
    fin>>n;
    for (i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    a[0]=2100000000;
    b[0]=0;
    lmax=0;
    for (i=n;i>=1;i--)
    {
        l=cb(a,b,0,lmax,a[i]);
        if (l>lmax)
        {
            c[i]=b[l-1];
            lmax=l;
            b[l]=i;
        }
        else
        {
            c[i]=b[l-1];
            if (a[b[l]]<a[i])
            {
                b[l]=i;
            }
        }
    }
    fout<<lmax<<"\n";
    for (i=b[lmax];i>0;i=c[i])
    {
        fout<<a[i]<<" ";
    }
    fin.close();
    fout.close();
    return 0;
}