Cod sursa(job #2137781)

Utilizator radurotaruRotaru Radu Stefan radurotaru Data 21 februarie 2018 01:18:06
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int v[100001],t[100001],b[100001],a[100001],lungime,n,q,d;
int binarysearch(int v[],int l,int r,int k)
{
    while(r-l>1)
    {
        int m=l+(r-l)/2;
        if(v[m]>=k)
            r=m;
        else
            l=m;
    }
    return r;
}
int LIS(int v[])
{
    t[0]=v[0];
    a[0]=-1;
    lungime=1;
    for(int i=1; i<=n; i++)
    {
        if(v[i]<t[0])
        {
            t[0]=v[i];
            b[0]=i;
            a[i]=-1;
        }
        else if(v[i]>t[lungime-1])
        {
            t[lungime]=v[i];
            b[lungime]=i;
            a[i]=b[lungime-1];
            lungime++;
        }
        else
        {
            int h=binarysearch(t,-1,lungime-1,v[i]);
            t[h]=v[i];
            b[h]=i;
            a[i]=b[h-1];

        }
    }
    return lungime;
}
void recursiv(int x,int v[])
{
    if(a[x]!=-1)
        recursiv(a[x],v);
    g<<v[x]<<" ";
}
int main()
{
    f>>n;
    for(int i=0; i<n; i++)
        f>>v[i];
    q=LIS(v);
    g<<q<<endl;
    d=b[q-1];
    recursiv(d,v);
    return 0;
}