Cod sursa(job #1328922)

Utilizator ooptNemes Alin oopt Data 28 ianuarie 2015 21:22:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
/// scmax
#include <bits/stdc++.h>
#define NMax 100005
using namespace std;

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

int n, nr;
int A[NMax], pr[NMax], bst[NMax];

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

    return left;
}

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

int main() {

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

    g<<nr<<'\n';
    write(bst[nr]);

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