Cod sursa(job #1089751)

Utilizator kiralalaChitoraga Dumitru kiralala Data 21 ianuarie 2014 21:51:27
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>
#define NMAX 100005

using namespace std;

FILE* f=freopen("scmax.in","r",stdin);
FILE* o=freopen("scmax.out","w",stdout);

int n;
int v[NMAX];
int b[NMAX],lb,p[NMAX];

void WriteSequence(int i, int ind)
{
    if(ind==0) return;
    if(p[i]==ind)
    {
        WriteSequence(i-1,ind-1);
        printf("%d ",v[i]);
    }
    else
        WriteSequence(i-1,ind);
}

int Insert(int x)
{
    if(b[lb]<x) { b[++lb]=x; return lb; }
    int poz,i;
    for(i=1;i<=lb;i<<=1);
    for(poz=0;i;i>>=1)
        if(poz+i<=lb&&b[poz+i]<=x)
            poz+=i;
    b[poz+1]=x;
    return poz+1;
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&v[i]);
        p[i]=Insert(v[i]);
    }

    printf("%d\n",lb);
    WriteSequence(n,lb);

    return 0;
}