Cod sursa(job #906337)

Utilizator assa98Andrei Stanciu assa98 Data 6 martie 2013 19:09:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;

int v[100100];
int n;

int size;

int d[100100]; //d[i]=pozitia celui mai mic element cu care se termina scmax de lungime i
int from[100100];

int rez;
void b_search(int st,int dr,int poz)
{
    if(st<=dr)
    {
        int mij=(st+dr)/2;
        if(v[d[mij]]<v[poz])
        {
            rez=mij;
            b_search(mij+1,dr,poz);
        }
        else
            b_search(st,mij-1,poz);
    }
}

void getsol(int sol[1001000])
{
    int poz=d[size];
    while(poz)
    {
        sol[++sol[0]]=v[poz];
        poz=from[poz];
    }
    reverse(sol+1,sol+sol[0]+1);
}


int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    d[++size]=1;
    for(int i=2;i<=n;i++)
    {
        if(v[i]>v[d[size]])
        {
            d[++size]=i;
            from[i]=d[size-1];
        }
        else
        {
            rez=0;
            b_search(0,size,i);
            if(v[i]<v[d[rez+1]])
            {
                d[rez+1]=i;
                from[i]=d[rez];
            }
        }
    }
    int sol[100100];
    getsol(sol);
    printf("%d\n",size);
    for(int i=1;i<=size;i++)
        printf("%d ",sol[i]);
    return 0;
}