Cod sursa(job #1779275)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 15 octombrie 2016 00:07:33
Problema Subsir crescator maximal Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <string.h>
#define MAX 10005

int n, a[MAX], p[MAX], q[MAX], nr;

int cb(int x){
    int s = 1, d = nr, m;
    while(s < d){
        m = (s + d) / 2;
        if(q[m] == x)
            return m;
        if(q[m] > x){
            if(m == 1)
                return m;
            if(q[m - 1] < x)
                return m;
            else
                d = m - 1;
        }
        else
            s = m + 1;
    }

    if(s == d){
        if(q[s] == x)
            return s;
        if(q[s] > x){
            if(s == 1)
                return s;
            if(q[s - 1] < x)
                return s;
            else
                return nr + 1;
        }
        else
            return nr + 1;
    }
}

void print(int n, int nr){
    if(!n || !nr)
        return;
    if(p[n] == nr){
        print(n - 1, nr - 1);
        printf("%d ", a[n]);
    }
    else
        print(n - 1, nr);
}

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i){
        scanf("%d", &a[i]);
        int pos = cb(a[i]);
        if(nr < pos)
            nr = pos;
        p[i] = pos;
        q[pos] = a[i];
    }

    printf("%d\n", nr);
    print(n, nr);
    printf("\n");
    return 0;
}