Cod sursa(job #2304556)

Utilizator maria15Maria Dinca maria15 Data 18 decembrie 2018 10:32:53
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 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(sol, dr+1);
            }
        }
    }
    u = n;
    while(u){
        sir[nr++] = u;
        u = t[u];
    }
    fout<<nr-1<<"\n";
    for(i=nr-1;i>0;i--)
        fout<<v[sir[i]]<<" ";
    return 0;
}