Cod sursa(job #1809253)

Utilizator maria15Maria Dinca maria15 Data 18 noiembrie 2016 19:14:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>

using namespace std;

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

int n, i, j, d[100001], k, v[100001], t[100010];


void solutie(int u) {
    if (u) {
        solutie(t[u]);
        fout<<v[ u ]<<" ";
    }
}

int main(){
    // 6 11  3  2  5  9  7  8  1  4  5
    // 1  2  1  1  2  3  3  4  1  2  3
    // 1  4  7  8
    // D[k] = valoarea minima ce ppoate fi la finalul unui subsir crescator de lungime k
    // dupa ce am paercurs primele i numere din sirul meu
    // DE FAPT TIN IN D[i] INDICELE DIN v al VALORII DEFINITE MAI SUS
    fin>>n;
    for (i=1;i<=n;i++) {
        fin>>v[i];
    }
    d[1] = 1;
    k = 1;
    int st, dr;
    for (i=2;i<=n;i++) {
        // caut prima pozitie >=v[i] si pe aceea o voi inlocui
        st = 1;
        dr = k;
        while (st <= dr) {
            int mid = (st + dr)/2;
            if (v[  d[mid]  ] >= v[i])
                dr = mid - 1;
            else
                st = mid + 1;
        }
        if (st > k) //(st == k+1) {
            k++;
        d[st] = i;
        t[i] = d[st-1];
    }

    fout<<k<<"\n";

    // in t[i] memoram, in momentul in care punem indicele i in D, valoarea indicelui pus in d pe pozitia
    // anterioara celei pe care l-am pus pe i, pozitie din acest momment
    solutie(d[k]);

    return 0;
}