Cod sursa(job #1241157)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 12 octombrie 2014 20:13:37
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

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];
    vector<int> sol;
    for (; dim; dim --) {
        sol.push_back(val[poz]);
        poz = last[poz];
    }
    reverse(sol.begin(), sol.end());
    for (vector<int> :: iterator it = sol.begin(); it < sol.end() ; it++) {
        g << *it <<' ' ;
    }
    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;
}