Pagini recente » Cod sursa (job #2981659) | Cod sursa (job #1610526) | Cod sursa (job #2724116) | Cod sursa (job #309503) | Cod sursa (job #2681177)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, a[100002], lmax[100002], nr, p[100002], ans[100002];
int smallest_value_greater_than_ai(int l, int r, int x){
if(l <= r){
int mid = l + (r - l) / 2;
if(x < a[mid]){
if(mid == l or x >= a[mid - 1]) return mid;
else r = mid - 1;
}
else l = mid + 1;
}
return l;
}
int main(){
in >> n;
for(int i = 1; i <= n; i++) in >> a[i];
lmax[1] = a[1]; p[1] = 1; nr = 1;
for(int i = 2; i <= n; i++){
if(a[i] < lmax[1]){
lmax[1] = a[i]; p[i] = 1;
}
else if(a[i] >= lmax[nr]){
nr = nr + 1; lmax[nr] = a[i];
p[i] = nr;
}
else{
int poz = smallest_value_greater_than_ai(1, nr, a[i]);
lmax[poz] = a[i]; p[i] = poz;
}
}
out << nr << "\n";
int poz = n;
for(int i = nr; i >= 1; i--){
while(p[poz] != i) poz = poz - 1;
ans[i] = a[poz];
}
for(int i = 1; i <= nr; i++) out << ans[i] << " ";
return 0;
}