Cod sursa(job #1122665)

Utilizator cristitamasTamas Cristian cristitamas Data 25 februarie 2014 19:43:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <cstdio>
#define Nmax 100010
using namespace std;

int N;
int Nr,poz;
int L[Nmax],A[Nmax],V[Nmax];

void Citire()
{
    scanf("%d",&N);
    for(int i=1;i<=N;++i)
        scanf("%d ",&A[i]);
}

int Caut(int x)
{
    int p,u,m;
    p=1;
    u=Nr;
    m=(p+u)/2;
    while(p<=u)
    {
        if(x<=V[m] && x>V[m-1])
            return m;
        else
        {
            if(x>V[m])
            {
                p=m+1;
                m=(p+u)/2;
            }
            else
            {
                u=m-1;
                m=(p+u)/2;
            }
        }
    }
    return -1;
}

void Afisare(int i)
{
    for(int j=i-1;j>0;--j)
        if(L[j]+1==L[i])
        {
            Afisare(j);
            break;
        }
    printf("%d ",A[i]);
}



int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    Citire();
    Nr=1;
    V[1]=A[1];
    L[1]=1;
    for(int i=2;i<=N;++i)
    {
        poz=Caut(A[i]);
        if(poz==-1)
        {
            V[++Nr]=A[i];
            L[i]=Nr;
        }
        else
        {
            V[poz]=A[i];
            L[i]=poz;
        }
    }
    printf("%d\n",Nr);
    for(int i=N;i>=0;--i)
        if(L[i]==Nr)
        {
            Afisare(i);
            break;
        }
    return 0;
}