Pagini recente » Cod sursa (job #2624226) | Cod sursa (job #2431211) | Cod sursa (job #2231698) | Cod sursa (job #1367176) | Cod sursa (job #2136067)
#include<cstdio>
#include<cstring>
using namespace std;
#define NMAX 100005
int n, h[NMAX], sol[NMAX], length, v[NMAX];
int BinarySearch(int val, int left, int right){
int m = (left + right) / 2 ;
if(val <= v[ h[m] ] && val >= v[ h[m-1] ]){
return m;
}
else
if(val < v[ h[m] ]){
return BinarySearch(val, left, m);
}
else{
return BinarySearch(val, m + 1, right);
}
}
void afis(int i){
if(sol[i] == -1){
return;
}
afis( sol[i] );
printf("%d ", v[i]);
}
int main()
{
memset(sol, -1, sizeof(sol));
int i, poz;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%d", &v[i]);
}
h[1] = 1;
sol[1] = 0;
length = 1;
for(i=2; i<=n; i++){
if(v[i] < v[ h[1] ]){
h[1] = i;
sol[i] = h[0];
}
else
if(v[i] > v[ h[length] ]){
h[++length] = i;
sol[i] = h[length - 1];
}
else{
poz = BinarySearch(v[i], 1, length);
h[poz] = i;
sol[i] = h[poz - 1];
}
}
printf("%d\n", length);
afis(h[length]);
return 0;
}