Pagini recente » Cod sursa (job #2030881) | Cod sursa (job #743239) | Cod sursa (job #3296489) | Cod sursa (job #836643) | Cod sursa (job #2646483)
#include <bits/stdc++.h>
using namespace std;
const int DIM = 100000 + 5;
int a[DIM], scm[DIM], dad[DIM];
int bs(int x)
{
int left = 1, right = scm[DIM - 1], mx = 0;
while(left <= right) {
int mid = (left + right) >> 1;
if(x > a[scm[mid]]) left = mid + 1, mx = max(mx, mid);
else right = mid - 1;
}
return mx;
}
void path(int k)
{
if(dad[k] != 0) path(dad[k]);
printf("%d ", a[k]);
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
scm[1] = 1;
scm[DIM - 1] = 1;
for(int i = 2; i <= n; ++i) {
int pos = bs(a[i]);
scm[pos + 1] = i;
dad[i] = scm[pos];
scm[DIM - 1] = max(pos + 1, scm[DIM - 1]);
}
printf("%d\n", scm[DIM - 1]);
path(scm[scm[DIM - 1]]);
return 0;
}