Cod sursa(job #2441907)

Utilizator red_devil99Mancunian Red red_devil99 Data 21 iulie 2019 21:14:55
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define mx 100003

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

int v[mx], best[mx], poz[mx], n, sol, k;

int cautare(int x){
    int left = 1, right = sol, middle;
    while(left <= right){
    	middle = (left+right)/2;
    	if(x >= v[best[middle]]){
    		left = middle + 1;
    	}else{
    		right = middle - 1;
    	}
    }
    return left;
}

int main(){

	fin >> n;
    for(int i = 1; i <= n; ++i){
        fin >> v[i];
    }
    best[1] = 1;
    sol = 1;
    for(int i = 2; i <= n; ++i){
    	k = cautare(v[i]);
    	sol = std::max(sol, k);
    	best[k] = i;
    	poz[i] = best[k-1];
    }
    std::vector<int> rasp;
    int pos = best[sol];
    while(pos){
    	rasp.push_back(v[pos]);
    	pos = poz[pos];
    }
      fout << rasp.size()  << '\n';
	
    for(int i = rasp.size() - 1; i >= 0; --i){
	
        fout << rasp[i] << ' ';
    }
    return 0;
}