Cod sursa(job #873421)

Utilizator mihai995mihai995 mihai995 Data 7 februarie 2013 10:51:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
using namespace std;

const int N = 100001;
int v[N], best[N], T[N], n;

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

int bs(int x, int p){
    int i = 0;

    for (int step = 1 << 16 ; step ; step >>= 1)
        if (i + step <= best[0] && v[ best[i + step] ] < x)
            i += step;

    return i;
}

void update(int p){
    int ans = bs(v[p], p);

    if (ans == best[0])
        ++best[0];

    if (ans)
        T[p] = best[ans];
    best[ans + 1] = p;
}

void build_sol(int x){
    if (x == 0)
        return;

    build_sol(T[x]);

    out << v[x] << " ";
}

int main(){
    in >> n;

    for (int i = 1 ; i <= n ; i++)
        in >> v[i];

    for (int i = 1 ; i <= n ; i++)
        update(i);

    out << best[0] << "\n";

    build_sol(best[best[0]]);

    out << "\n";

    return 0;
}