Cod sursa(job #485395)

Utilizator Sm3USmeu Rares Sm3U Data 18 septembrie 2010 11:42:09
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <stdio.h>

using namespace std;

struct sir{

    int val;
    int s1;
    int s2;
}a[100010];


int n;

void citire(){

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

void afisare(int poz)
{
    int b[100005];
    int m=poz;
    printf("%d \n",poz+1);
    for(int i=n-1;i>=0 && poz!=-1 ;i--)
    {
        if(a[i].s2==poz)
        {
            b[poz]=a[i].val;
            poz--;
        }
    }
    for(int i=0;i<=m;i++)
        printf("%d ",b[i]);


}

void prelucrare()
{
     int poz=0;
     a[0].s2=0;
     a[0].s1=a[0].val;
     for(int i=1;i<n;i++)
     {
        if(a[i].val>a[poz].s1)
        {
            a[i].s2=++poz;
            a[poz].s1=a[i].val;
        }
        else
        {
            for(int j=poz;j>=0;j--)
                if(a[i].val>a[j].s1 || j==0)
                {
                    a[i].s2=j;
                    a[j].s1=a[i].val;
                    break;
                }
        }

     }
     afisare(poz);
}


int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    citire();
    prelucrare();

    return 0;

}

/* #include <stdio.h>

using namespace std;

struct sir{

 int val;
 int lg;
 int poz;

}a[100];

int n;

void citire(){

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

void maxim(int &lg, int &poz, int i)
{
    int x=a[i].val;
    for(;i<n;i++)
    {
        if(a[i].val>x)
        {
            if(lg<a[i].lg)
            {
                lg=a[i].lg;
                poz=i;
            }
        }
    }


}

void prelucrare()
{
    for(int i=n-1;i>=0;i--)
    {
       int lg=0, poz=-1;
        maxim(lg,poz,i);
        a[i].lg=1+lg;
        a[i].poz=poz;
    }

}

void afisare(){

    int max=0,poz;
    for(int i=0;i<n;i++)
        if(a[i].lg>max)
            max=a[i].lg,poz=i;
    printf("%d\n",max);
    while(poz!=-1)
    {
        printf("%d ",a[poz].val);
        poz=a[poz].poz;
    }

}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    citire();
    prelucrare();
    afisare();


    return 0;
}
*/