Pagini recente » Cod sursa (job #191274) | Cod sursa (job #85074) | Cod sursa (job #86306) | Cod sursa (job #2000410) | Cod sursa (job #1621646)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long unsigned
#define pb push_back
#define mp make_pair
const int N = 100005;
int v[N],sol[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[sol[i+step]] <= x){
i += step;
}
}
return i;
}
int main(){
int i,n;
freopen("maxk.in", "r", stdin);
freopen("maxk.out", "w", stdout);
scanf("%d",&n);
for(i = 1;i <= n;i++){
scanf("%d",&v[i]);
}
int l = 1;
sol[1] = 1;
for(i = 2;i <= n;i++){
if(v[i] > v[sol[l]]){
sol[++l] = i;
p[i] = sol[l-1];
}else{
int poz = binarySearch(v[i]-1, l)+1;
sol[poz] = i;
p[i] = sol[poz-1];
}
}
printf("%d\n",l);
for(i = sol[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;
}