Cod sursa(job #2485866)

Utilizator ana.pintiliciucAna Maria Pintiliciuc ana.pintiliciuc Data 2 noiembrie 2019 10:17:25
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>

using namespace std;

int n;
long long a[100005], v[100005], p[100005];
int lv;

int caut_bin(int x)
{
    int st=0, dr=lv, pos=-1;
    long long vmin=2000000005;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(v[mij]>=x)
        {
            if(vmin>a[mij])
            {
                vmin=a[mij];
                pos=mij;
            }
            dr=mij-1;
        }
        if(v[mij]<x)
        {
            st=mij+1;
        }
    }
    return pos;
}

int sol[100005];

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

    scanf("%d", &n);
    int vm=0;
    for(int i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
        int poz=caut_bin(a[i]);
        if(poz==-1)
        {
            v[lv++]=a[i];
            p[i]=p[i-1]+1;
        }
        else
        {
            v[poz]=a[i];
            p[i]=poz+1;
        }

        if(p[i]>p[vm])
        {
            vm=i;
        }
    }
    /**for(int i=0; i<lv; i++)
        printf("%d ", v[i]);
    printf("\n");
    for(int i=0; i<n; i++)
        printf("%d ", p[i]);**/
    printf("%d\n", p[vm]);
    int ant=p[vm]-1, aux=lv-1;
    sol[aux--]=a[vm];
    for(int i=vm-1; i>=0 && aux>=0; i--)
    {
        if(p[i]==ant)
        {
            sol[aux--]=a[i];
            ant--;
        }
    }
    for(int i=0; i<lv; i++)
        printf("%d ", sol[i]);

    return 0;
}