Pagini recente » Cod sursa (job #3281786) | Cod sursa (job #2704669) | Cod sursa (job #2310293) | Cod sursa (job #2391604) | Cod sursa (job #1552905)
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int v[N],lis[N],p[N];
vector <int> ans;
int binarySearch(int x, int n){
int i,step;
for(step = 1;step <= n;step <<= 1);
for(i = 0;step;step >>= 1){
if(i+step <= n && v[lis[i+step]] <= x){
i += step;
}
}
return i;
}
int main()
{
int n,i,l,poz;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d",&n);
l = 1;
for(i = 1;i <= n;i++){
scanf("%d",&v[i]);
}
lis[1] = 1;
for(i = 2;i <= n;i++){
if(v[i] > v[lis[l]]){
lis[++l] = i;
p[i] = lis[l-1];
}else{
poz = binarySearch(v[i]-1, l)+1;
lis[poz] = i;
p[i] = lis[poz-1];
}
// for(int j = 1;j <= l;j++){
// printf("%d ",v[lis[j]]);
// }
// printf("\n");
}
printf("%d\n",l);
for(i = lis[l];p[i] > 0;i = p[i]){
ans.push_back(v[i]);
}
ans.push_back(v[i]);
reverse(ans.begin(), ans.end());
for(auto it : ans){
printf("%d ",it);
}
return 0;
}