Cod sursa(job #432428)

Utilizator hasegandaniHasegan Daniel hasegandani Data 2 aprilie 2010 12:48:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

#define Nmax 100005
#define Buf 1005

char buff[Buf];
int poz=Buf-1;

int N,a[Nmax],M=1;
int best[Nmax],L[Nmax],prec[Nmax];
int Sol[Nmax];

int caut(int x)
{
    int st,dr,last=0,mid;

    for(st=0 , dr=M; st<=dr ;)
        {
        mid = st+(dr-st)/2;
        if (x > a[ L[mid] ])
            {
            st=mid+1;
            last = mid;
            }
        else
            dr = mid-1;
        }
    return last;
}

void solve()
{
    best[1]=1;
    L[1]=1;

    for(int i=2;i<=N;++i)
        {
        poz = caut(a[i]);
        best[i] = poz+1;
        prec[i] = L[poz];
        if (a[ L[poz+1] ] > a[i])
            L[poz+1] = i;
        if (M < poz+1)
            {
            M = poz+1;
            L[poz+1] = i;
            }
        }
    for(int i=L[M];i;i=prec[i])
        Sol[++Sol[0]]=a[i];
    printf("%d\n",M);
    for(int i=Sol[0];i;--i)
        printf("%d ",Sol[i]);
    printf("\n");
}

void read(int &nr)
{
    for(; !isdigit(buff[poz]) ;)
        if (++poz == Buf)
            {
            fread(buff,1,Buf,stdin);
            poz=0;
            }
    for(nr=0; isdigit(buff[poz]) ;)
        {
        nr=nr*10 + buff[poz]-'0';
        if (++poz==Buf)
            {
            fread(buff,1,Buf,stdin);
            poz=0;
            }
        }
}

void cit();

int main()
{
    cit();
    solve();
    return 0;
}

void cit()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    read(N);
    for(int i=1;i<=N;++i)
        read(a[i]);
}