Cod sursa(job #1181912)

Utilizator TibixbAndrei Tiberiu Tibixb Data 4 mai 2014 11:23:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#define DIM 100010
using namespace std;

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

int d[DIM], v[DIM], n, i, k, p, u, mid, t[DIM];

void drum(int u) {
    if (u!=0) {

        drum(t[u]);
        fout<<v[u]<<" ";
    }
}

int main() {
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>v[i];
    }

    k = 1;
    d[1] = 1; // d[k] = cea mai mica valoare in care se termina un subsir de lungime k
                // folosind primele i elemente din v, de fapt pozitia din v a acestei valori
    for (i=2;i<=n;i++) {
        // caut pe v[i] in d pe pozitii de la 1 la k
        p = 1;
        u = k;
        while (p<=u) {
            mid = p + (u-p)/2;
            if (v[ d[mid] ] >= v[i])
                u = mid-1;
            else
                p = mid+1;
        }
        if (p > k) {
            d[++k] = i;
            t[i] = d[p-1];
        } else
            if (v[i] < v[ d[p] ]) {
                d[p] = i;
                t[i] = d[p-1];
            }
    }

    fout<<k<<"\n";

    drum(d[k]);

    return 0;
}