Pagini recente » Cod sursa (job #2020942) | Cod sursa (job #653874) | Cod sursa (job #782254) | Cod sursa (job #2053292) | Cod sursa (job #3004247)
#include <fstream>
#include <vector>
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
std::vector<int> arr, D, pos, I;
int main(){
int k = 0;
fin >> n;
arr = D = pos = I = std::vector<int> (n + 1);
for(int i = 1; i <= n; i++){
fin >> arr[i];
}
D[++k] = arr[1];
for(int i = 2; i <= n; i++){
if(arr[i] > D[k]){
D[++k] = arr[i];
pos[i] = k;
}
else if(arr[i] < D[k]){
int left = 1, right = k, poz = k + 1;
while(left <= right){
int mid = left + (right - left)/2;
if(D[mid] > arr[i]){
poz = mid;
right = mid - 1;
}
else{
left = mid + 1;
}
}
D[poz] = arr[i];
pos[i] = poz;
}
}
fout << k << "\n";
int j = n;
for(int i = k; i >= 1; i--){
while(pos[j] != i){
j --;
}
I[i] = j;
}
for(int i = 1; i <= k; i++){
fout << arr[I[i]] << " ";
}
}