Pagini recente » Cod sursa (job #1264440) | Cod sursa (job #3185768) | Cod sursa (job #493693) | Cod sursa (job #1242493) | Cod sursa (job #2453166)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define mx 100090
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;
}