Cod sursa(job #2409714)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 19 aprilie 2019 12:49:30
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#include <vector>
#define DIM 100002

using namespace std;

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

int n, k = 1;
int v[DIM], dp[DIM], t[DIM];

vector<int> sol;

int main(int argc, const char * argv[]) {
    
    in>>n;
    for(int i = 1; i <= n; ++ i){
        in>>v[i];
    }
    
    dp[1] = 1;
    
    for(int i = 2; i <= n; ++ i){
        int st = 1;
        int dr = k;
        while(st <= dr){
            int mid = (st + dr) / 2;
            if(v[dp[mid]] < v[i]){
                st = mid + 1;
            }
            else{
                dr = mid - 1;
            }
        }
        
        dp[st] = i;
        t[i] = dp[st - 1];
        if(st > k)
            k = st;
        
    }
    
    int crt = dp[k];
    while(crt != 0){
        sol.push_back(v[crt]);
        crt = t[crt];
    }
    
    out<<sol.size()<<'\n';
    for(int i = sol.size() - 1; i >= 0; -- i)
        out<<sol[i]<<" ";
    
    
    
    return 0;
}