Cod sursa(job #1402393)

Utilizator FloareaCucura Floarea Ludovica Floarea Data 26 martie 2015 15:58:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#define N 100003
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
int n,r,v[N],b[N],l[N];

int cauta (int k)
{
    int a=1,b=r,m;
    while(a<b)
    {
        m=(a+b)/2;
       if(k>l[m])
        a=m+1;
        if(k<=l[m])
            b=m;
    }
    return a;
}

void afis(int k, int h)
{
    if(k)
    {
        while(b[h]!=k)
            h--;
        afis(k-1,h-1);
        out<<v[h]<<" ";
    }
}

int main()
{
    int i,j,p;
    in>>n;
    for(i=1;i<=n;i++)
        in>>v[i];
    l[++r]=v[1];
    b[1]=1;
    for(i=2;i<=n;i++)
    {
        if(v[i]>l[r])
        {
            r++;
            l[r]=v[i];
            b[i]=r;
        }
        else
        {
            p=cauta(v[i]);
            if(l[p]>v[i])
                l[p]=v[i];
            b[i]=p;
        }
    }
    out<<r<<'\n';
    afis(r,n);
    return 0;
}