Cod sursa(job #2538628)

Utilizator marius004scarlat marius marius004 Data 4 februarie 2020 21:26:13
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
 
std::ifstream f("scmax.in");
std::ofstream g("scmax.out");
 
const int NMAX = 100'001;
int n,len,v[NMAX],t[NMAX],l[NMAX],last;

std::vector<int>sol;
 
// v - arrayul citit de la tastatura
// t - vectorul de tati
// l - arrayul de dinamica
 
int search(int left,int right,int x){
    
    while(left <= right){
        
        int mid = (left + right) / 2;
        
        if(mid + 1 <= len && v[l[mid]] < x && x <= v[l[mid + 1]])
            return mid + 1;
        if(v[l[mid]] < x)
            left = mid + 1;
        else
            right = mid - 1;
    }
    
    return -1;
}
 
void reconst(int index){
    if(t[index] != -1)
        reconst(t[index]);
    else
        last = index;
    sol.push_back(v[index]);
}
 
int main(){
    
    f >> n;
    
    for(int i = 0;i < n;++i){
        f >> v[i];
        t[i] = -1;
    }
    
    len = 0;
    l[0] = 0;
    
    for(int i = 1;i < n;++i){
        
        if(v[l[0]] > v[i]){
            l[0] = i;
            continue;
        }
        
        if(v[l[len]] < v[i]){
            len++;
            l[len] = i;
            t[l[len]] = l[len - 1];
            continue;
        }
        
        int index = search(0,len,v[i]);
        l[index] = i;
        t[l[index]] = t[index - 1];
    }
    
    g << len + 1 << '\n';
    
    reconst(l[len]);
    
    int e = v[last];
    
    while(last >= 0){
        if(v[last] < e){
            g << v[last] << ' ';
            break;
        }
        last--;
    }
    
    for(int i = 0;i < sol.size();++i)
        g << sol[i] << ' ';
    
    return 0;
}