Cod sursa(job #1089074)

Utilizator kiralalaChitoraga Dumitru kiralala Data 21 ianuarie 2014 14:44:56
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include<stack>
#define NMAX 100003

using namespace std;

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

int n,a[NMAX];
int best[NMAX],poz[NMAX],lb;
stack<int> output;

int Bs(int x)
{
    int i=1,j=lb+1,mij,p=-1;
    while(i<j)
    {
        mij=(i+j)/2;
        if(best[mij]>=x)
        {
            p=mij;
            j=mij-1;
        }
        else
        {
            i=mij+1;
        }
    }

    return p;
}

int Insert(int x)
{
    if(best[lb]<x)
    {
        best[++lb]=x;
        return lb;
    }
    else
    {
        int p=Bs(x);
        best[p]=x;
        return p;
    }
    return -1;
}

int main()
{
    scanf("%d",&n);

    for(int i=0;i<n;++i)
    {
        scanf("%d",&a[i]);
        poz[i]=Insert(a[i]);
    }

    printf("%d\n",lb);
    int p=lb;
    for(int i=n-1;i>=0;--i)
    {
        if(poz[i]==p)
        {
            output.push(a[i]);
            p-=1;
        }
    }

    while(!output.empty())
    {
        printf("%d ",output.top());
        output.pop();
    }

    return 0;
}