Cod sursa(job #1234338)

Utilizator MoneaVladMonea Vlad MoneaVlad Data 27 septembrie 2014 10:41:17
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>

using namespace std;

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

int v[100005], sol[100005], prec[100005], p;

int caut(int x){
    int st = 1, dr = p;
    while (st + 1 < dr) {
        int mid = st + (dr - st) / 2;
        if(v[sol[mid]] >= x) {
            dr = mid - 1;
        }
        else
        {
            st = mid + 1;
        }
    }
    return st;
}

void afisare(int x){
    if(prec[x])
        afisare(prec[x]);
    out << v[x] << " ";
}

int main()
{
    int n, i, poz;
    in >> n;
    for(i = 1; i <= n; i++) {
        in >> v[i];
        if(v[i] > v[sol[p]]) {
            p++;
            sol[p] = i;
            prec[i] = sol[p-1];
        }
        else
        {
            poz = caut(v[i]);
            sol[poz] = i;
            prec[i] = sol[poz-1];
        }
    }
    out << p << "\n";
    afisare(sol[p]);
    in.close();
    out.close();
    return 0;
}