Cod sursa(job #1774718)

Utilizator calin9819Costea Calin calin9819 Data 9 octombrie 2016 13:01:38
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream>
#include<iostream>
using namespace std;

#define MAX 100001
ifstream f("scmax.in");
int a[MAX], b[MAX], poz[MAX];
int n, m;

void citire() {
    int i;
    f >> n;
    for (i = 1; i <= n; i++)
        f >> a[i];
}

int caut (int p, int u, int x) {
    int m;
    while (p <= u) {
        m = p + (u - p) / 2;
        if (x < a[b[m]])
            p = m + 1;
        else
            u = m - 1;
    }
    return p;
}

void subsir() {
    int i, j, k;
    a[0] = 1234567890;
    for (i = n; i >= 1; i--) {
        poz[i] = 0;
        k = caut (1, m, a[i]);
        if (k > m) {
            poz[i] = b[k - 1];
            m = k;
            b[k] = i;
        }
        else {
            poz[i] = b[k - 1];
            if (a[b[k]] < a[i])
                b[k] = i;
        }
    }
}

void tipar() {
    int i;
    cout << m << '\n';
    for (i = b[m]; i > 0; i = poz[i]) {
        cout << a[i] << ' ';
    }
}

int main() {
    citire();
    subsir();
    tipar();
    f.close();
    return 0;
}