Cod sursa(job #978609)

Utilizator raulmuresanRaul Muresan raulmuresan Data 29 iulie 2013 11:37:53
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
// subsir crescator maximal cu cautare binara


#include <cstdio>

using namespace std;
int i, j, n, lung[100005],cont,maxi,sf,val[100005],aux,sol[100005];
int v[100005];

int minim(int a,int b)
{
    if(a<b) return a;
    return b;
}

void afisare()
{
    int t;
    for(t=1;t<=sf;t++)
    {
        printf("%d ",val[t]);
    }
    printf("\n");
}

int binary(int st,int dr,int x)
{
    int mij;

    while(st<=dr+1)
    {
        mij=(st+dr)/2;
        if(mij==dr || (val[mij]>=x && val[mij-1]<x))
        {
            val[mij]=minim(val[mij],x);

            return mij;
        }
        else
        {
            if(val[mij]>x)
            {
                dr=mij-1;
            }
            else
            st=mij+1;
        }
    }
}


int main() {

    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        if(v[i]>val[sf])
        {
            sf++;
            val[sf]=v[i];
            lung[i]=sf;
        }
        else
        {
            lung[i]=binary(1,sf,v[i]);
        }
       // afisare();
    }
    printf("%d\n",sf);

    for(i=1;i<=n;i++)
    {
       // printf("%d ",lung[i]);
    }

    int t=sf;
    i=n;
    cont=0;
    aux=2000000000;
    while (sf) {
        if (lung[i] == sf && v[i]<aux) {
            cont++;
            sol[sf]=v[i];
            aux=v[i];
            sf--;
        }
        i--;
    }

    for(i=1;i<=t;i++)
    {
        printf("%d ",sol[i]);
    }
}