Cod sursa(job #2304544)

Utilizator maria15Maria Dinca maria15 Data 18 decembrie 2018 10:24:10
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

using namespace std;

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

int n, i, v[100001], d[100001], sol, st, dr, mid, t[100001], sir[100001], u, nr;

int main(){
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    d[1] = 1;
    sol = 1;
    n++;
    v[n] = 2000000001;
    for(i=2;i<=n;i++)
        d[i] = n;
    for(i=2;i<=n;i++){
        st = 1, dr = sol;
        while(st <= dr){       /// caut cel mai mare v[d[x]] mai mic decat v[i]
            mid = (st+dr)/2;
            if(v[d[mid]] >= v[i])
                dr = mid-1;
            else
                st = mid+1;
        }
        if(i == n)
            d[dr+1] = n, t[n] = d[dr];
        else{
        if(v[d[dr+1]] > v[i]){
            d[dr+1] = i;
            t[i] = d[dr];
            sol = max(dr+1, sol);
        }}
    }
    fout<<sol<<"\n";
    u = n;
    while(u){
        sir[nr++] = u;
        u = t[u];
    }
    for(i=nr-1;i>0;i--)
        fout<<v[sir[i]]<<" ";
    return 0;
}