Cod sursa(job #2538607)

Utilizator marius004scarlat marius marius004 Data 4 februarie 2020 21:10:14
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>

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

const int NMAX = 100'005;
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]);
    
    return 0;
}