Cod sursa(job #2485900)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 2 noiembrie 2019 10:33:19
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
using namespace std;

int a[100010];
int v[100010];
int p[100010];
int sol[100010];
int n, lmax;

int cautare_binara(int poz, int x, int l){
    int i;
    for(i=poz;l;l>>=1)
        if(i - l >=0 && v[i - l] >= x)
            i-=l;
    return i;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    int lg=1;
    int pozlmax=0;
    for(int i=0; i<n; i++){
        scanf("%d", &a[i]);
        if(i>lg)
            lg<<=1;
        int poz=cautare_binara(lmax,a[i],lg);
        if(poz==lmax){
            lmax=poz+1;
            pozlmax=i;
        }
        v[poz]=a[i];
        p[i]=poz;
        v[lmax]=10000000;
    }
    printf("%d\n", lmax);
//    for(int i=0; i<=lmax; i++)
//        printf("%d ", v[i]);
//    printf("\n");
//    for(int i=0; i<n; i++)
//        printf("%d ", p[i]);
//
//    printf("\n");
    int auxxlmax=lmax;
    lmax--;
    for(int i=pozlmax; i>=0; i--){
        if(p[i]==lmax)
        {
            sol[lmax]=a[i];
            lmax--;
        }
    }
    for(int i=0; i<auxxlmax; i++)
        printf("%d ", sol[i]);

    return 0;
}