Cod sursa(job #1595051)

Utilizator TopiAlexTopala Alexandru TopiAlex Data 9 februarie 2016 21:46:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#define N_MAX 100002
using namespace std;

int n;
int v[N_MAX];
int best[N_MAX];
int sir[N_MAX];
int p[N_MAX];
int nr;

inline void citire();
int findElem(int);
void afisare(int);

int main()
{
    citire();
    int maxi;
    int poz;

    best[1] = 1;
    sir[1] = 1;
    sir[0] = 0;
    nr = 1;

    for (int i = 2; i <= n; ++i){
        poz = findElem(v[i]);
        p[i] = sir[poz];
        best[i] = poz + 1;
        sir[poz+1] = i;
        if (nr < poz + 1)
            nr = poz + 1;
    }

    maxi = best[1];
    poz = 1;

    for (int i = 2; i <= n; ++i){
        if (best[i] > maxi){
            maxi = best[i];
            poz = i;
        }
    }

    printf("%d\n", maxi);
    afisare(poz);

    return 0;
}

inline void citire(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    scanf("%d", &n);

    for (int i = 1; i <= n; ++i) scanf("%d", v+i);
}

int findElem(int e){
    int p, u, m;
    p = 0;
    u = nr;
    m = (p + u) / 2;
    while (p <= u)
        if (v[sir[m]] < e && e <= v[sir[m+1]])
            return m;
        else if (v[sir[m+1]] < e){
            p = m + 1;
            m = (p + u) / 2;
        }else{
            u = m - 1;
            m = (p + u) / 2;
        }

    return nr;
}

void afisare(int i){
    if (p[i] > 0) afisare(p[i]);
    printf("%d ", v[i]);
}