Cod sursa(job #2558355)

Utilizator recapitulareOJIScarlat Marius Stefan recapitulareOJI Data 26 februarie 2020 15:30:11
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>

std::ifstream f("input.in");
std::ofstream g("output.out");

const int NMAX = 100010;
int n,v[NMAX],t[NMAX],d[NMAX],len;

void reconst(int index){
    
    if(t[index])
        reconst(t[index]);
    
    g << v[index] << ' ';
}

int main(){
    
    f >> n;
    
    for(int i = 1;i <= n;++i)
        f >> v[i];
    
    len = d[1] = 1;
    
    for(int i = 2;i <= n;++i){
        
        int left = 1;
        int right = len;
        
        while(left <= right){
            
            int mid = (left + right) >> 1;
            
            if(v[ d[mid] ] < v[i])
                left = mid + 1;
            else
                right = mid - 1;
        }
        
        int pos = left;
        
        if(pos > len){
            len++;
            d[len] = i;
            t[d[len]] = d[pos - 1];
        }else{
            d[pos] = i;
            t[d[pos]] = d[pos - 1];
        }
        
    }
    
    g << len << '\n';
    
    reconst(d[len]);
    
    return 0;
}