Cod sursa(job #1101578)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 8 februarie 2014 18:27:53
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n, v[100002], i, fr[100002], poz[100002], frmax, aux;

void bin(int L, int R) {
    int mij;
    while (R - L > 1) {
        mij = (R + L) / 2;
        if (v[fr[mij]] > v[i])
            L = mij;
        else
            R = mij;
    }
    if (v[fr[R]] > v[i]) {
        if (v[fr[R + 1]] < v[i]) {
            fr[R + 1] = i;
            poz[i] = fr[R];
            frmax++;
        }
    }else if (v[fr[L]] > v[i]) {
        fr[R] = i;
        poz[i] = fr[L];
    }
    if (v[fr[1]] < v[i]) {
        fr[1] = i;
        poz[i] = 0;
    }
}

int main() {
    fin >> n;
    for(i = 1; i <= n; i++) {
        fin >> v[i];
    }
    fr[1] = n;
    frmax = 1;
    for(i = n-1; i > 0; i--) {
        bin(1, frmax);
    }
    fout << frmax << '\n';
    aux = fr[frmax];
    for(i = 0; i < frmax; i++) {
        fout << v[aux] << ' ';
        aux = poz[aux];
    }
    fin.close();
    fout.close();
    return 0;
}