Cod sursa(job #1786997)

Utilizator raluca1234Tudor Raluca raluca1234 Data 23 octombrie 2016 23:01:25
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#define MAX_N 100000
using namespace std;

int a[MAX_N+5], sol[MAX_N+5], poz[MAX_N+5];

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n, i, nr, lmax, pmax, mij, st, dr, p;
    scanf("%d", &n);
    for (i=1; i<=n; i++)
        scanf("%d", &a[i]);
    sol[1]=a[1];
    poz[1]=1;
    nr=1;
    lmax=1;
    pmax=1;
    for (i=2; i<=n; i++){
        st=1; dr=nr; p=-1;
        while (st<=dr){
            mij=(st+dr)/2;
            if (a[i]<=sol[mij]){
                p=mij;
                dr=mij-1;
            }else
                st=mij+1;
        }
        if (p==-1){
            sol[++nr]=a[i];
            poz[i]=nr;
            if (nr>lmax){
                lmax=nr;
                pmax=i;
            }
        }else{
            sol[p]=a[i];
            poz[i]=p;
        }
    }
    p=lmax;
    for (i=pmax; i>=1 && p>0; i--){
        if (poz[i]==p){
            sol[p]=a[i];
            p--;
        }
    }
    printf("%d\n", lmax);
    for (i=1; i<=lmax; i++)
        printf("%d ", sol[i]);
    return 0;
}