Cod sursa(job #174798)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 9 aprilie 2008 11:45:15
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<stdio.h>

int n,w[100],a[100],s[100],e;
int lg=0;

void citire()
{
    freopen("scmax.in","r",stdin);
    scanf("%d", &n);
    for (int i=0; i<n; i++)
        scanf("%d", &a[i]);
    fclose(stdin);
}

void cautare(int st,int dr,int v)
{
    int q=(st+dr)/2;
    if (st<=dr)
    {
        if (w[q]==v)
            e=q+1;
        else if (w[q]<v)
            cautare(q+1, dr, v);
        else
        {
            e=q;
            cautare (st, q-1, v);
        }
   }
}

void rezolvare()
{
    for (int i=0; i<n; i++)
    {
        if (lg==0)
        {
            w[1]=a[i];
            ++lg;
            s[1]=1;
        }
        else if (a[i]>w[lg])
        {
            ++lg;
            w[lg]=a[i];
            s[lg]=lg;
        }
        else
	    {
            cautare(1,lg,a[i]);
            w[e]=a[i];
            s[i+1]=e;
	    }
    }
}

void afisare()
{
    freopen("scmax.out","w",stdout);
    printf("%d\n",lg);
    int q=lg,e;
    /*for (int i=n-1; i>=0; i--)
    {
        if (q<1)
            break;
        if (s[i]==q && (a[i-1]<e || q==lg))
        {
            printf("%d ",a[i-1]);
            q--;
            e=a[i-1];
        }
    }*/
    for (int i=1; i<=lg; i++)
        printf("%d ",w[i]);
}

int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}