Cod sursa(job #1241156)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 12 octombrie 2014 20:08:25
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>

using namespace std;

#define size 200000

int dim, n;
int val[size], st[size], last[size];

int searchPoz(int poz) {
    int power = 1, s = 0;
    for (; power*2 <= dim; power *= 2);
    for (; power; power /=2) {
        if (power + s <= dim && val[st[power+s]] < val[poz]) {
            s += power;
        }
    }
    s ++;
    if (s > dim) {
        dim ++;
    }
    return s;
}

void solve() {
    dim = 1;
    st[1] = 1;

    for (int i =2; i <= n; i++) {
        int poz = searchPoz(i);
        st[poz] = i;
        last[i] = st[poz - 1];
    }
}

void afisare() {
    ofstream g("scmax.out");
    g << dim << '\n';
    int poz = st[dim];
    for (; dim; dim --) {
        g << val[poz] << ' ';
        poz = last[poz];
    }
    g.close();
}

void citire() {
    ifstream f("scmax.in");
    f >> n ;
    for (int i = 1; i <=n ;i ++) {
        f >> val[i];
    }
    f.close();
}

int main() {
    citire();
    solve();
    afisare();
    return 0;
}