Cod sursa(job #934593)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 30 martie 2013 20:32:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

#define MAX 100005

using namespace std;

int N, NPoz, step, V[MAX], ans[MAX], dad[MAX];

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

inline int searchPoz(int val) {
    int poz = 0;
    for(int st = step; st; st >>= 1) {
        if(st + poz <= NPoz && V[ans[st + poz]] < val) poz += st;
    } return poz + 1;
}

void solve() {
    step = 1;
    for(int i = 1; i <= N; i++) {
        int poz = searchPoz(V[i]);
        dad[i] = ans[poz - 1];
        if(poz > NPoz) {
            ans[++NPoz] = i;
            if(step << 1 == NPoz) step <<= 1;
        } else ans[poz] = (V[i] < V[ans[poz]] ? i : ans[poz]);
    }
}

ofstream out("scmax.out");

void afisare(int el) {
    if(!el) return;
    afisare(dad[el]);
    out<<V[el]<<" ";
}

void afisare() {

    out<<NPoz<<"\n";
    afisare(ans[NPoz]);
    out.close();
}

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