Pagini recente » Cod sursa (job #3135195) | Cod sursa (job #1319082) | Cod sursa (job #344018) | Cod sursa (job #2695558) | Cod sursa (job #998274)
Cod sursa(job #998274)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int ne, dad[100005], mnum[100005], el[100005], best[100005];
int bs(int val){
int left = 1, right = ne, last = 0, mid;
while(left <= right){
mid = (left + right) / 2;
if(el[mnum[mid]] >= val)
right = mid - 1;
else{
left = mid + 1;
last = mid;
}
}
return last;
}
int main(){
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n;
scanf("%d", &n);
el[0] = 2e9;
best[1] = 1;
ne = 1;
scanf("%d", &el[1]);
mnum[1] = 1;
for(int i = 2; i <= n; ++i){
scanf("%d", &el[i]);
int pos = bs(el[i]);
best[i] = pos + 1;
ne = max(ne, pos + 1);
if(el[i] < el[mnum[pos + 1]])
mnum[pos + 1] = i;
dad[i] = mnum[pos];
}
vector<int> ans;
int p = mnum[ne];
while(p){
ans.push_back(el[p]);
p = dad[p];
}
printf("%d\n", (int)ans.size());
for(int i = ans.size() - 1; i >= 0; --i)
printf("%d ", ans[i]);
return 0;
}