Cod sursa(job #1328898)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 28 ianuarie 2015 21:01:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
#define NMax 100005
using namespace std;

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

int n;
int nr;
int A[NMax];
int best[NMax];
int previous[NMax];

void read() {
    f>>n;
    for (int i=1;i<=n;i++)
        f>>A[i];
}

int cautbin(int x) {
    int left=1, right=nr, mij;
    while (left <= right) {
        mij = (left+right)/2;
        if (x <= A[best[mij]]) {
            right = mij-1;
        } else {
            left = mij+1;
        }
    }

    return left;
}

void write(int x) {
    if (previous[x]) {
        write(previous[x]);
    }
    g<<A[x]<<' ';
}

void solve() {
    best[1] = nr = 1;

    for (int i=2;i<=n;i++) {
        if (A[i] > A[best[nr]]) {
            nr++;
            best[nr] = i;
            previous[i] = best[nr-1];
        } else {
            int poz = cautbin(A[i]);
            best[poz] = i;
            previous[i]  = best[poz-1];
        }
    }

    g<<nr<<endl;
    write(best[nr]);
}

int main() {

    read();
    solve();

    f.close(); g.close();
    return 0;
}