Pagini recente » Cod sursa (job #212021) | Cod sursa (job #572512) | Cod sursa (job #2084249) | Cod sursa (job #3280977) | Cod sursa (job #1160927)
#include <cstdio>
#include <algorithm>
using namespace std;
#define FILEIN "scmax.in"
#define FILEOUT "scmax.out"
#define NMAX 100005
int A[NMAX], B[NMAX], D[NMAX], Pre[NMAX], Pos[NMAX], Sol[NMAX], N;
int AIB[NMAX];
void update(int x, int i) {
while (x <= N) {
if (D[i] > D[AIB[x]])
AIB[x] = i;
x += (x & -x);
}
}
int query(int x) {
int y = 0;
while (x) {
if (D[AIB[x]] > D[y])
y = AIB[x];
x -= (x & -x);
}
return y;
}
int main() {
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
scanf("%d", &N);
for ( int i = 1; i <= N; i++ ) scanf("%d", &A[i]);
int k = 0;
for ( int i = 1; i <= N; i++ ) {
if (A[i] != B[k])
B[++k] = A[i];
}
sort(B+1, B+k+1);
for ( int i = 1, x; i <= N; i++ ) {
x = lower_bound(B+1, B+k+1, A[i]) - B;
Pre[i] = query(x - 1);
D[i] = D[Pre[i]] + 1;
update(x, i);
}
int MaxI = 0;
for ( int i = 1; i <= N; i++ ) {
if (D[i] > D[MaxI])
MaxI = i;
}
k = 0;
for ( int i = MaxI; i; i = Pre[i]) {
Sol[++k] = A[i];
}
printf("%d\n", D[MaxI]);
for ( int i = k; i; i-- ) {
printf("%d ", Sol[i]);
}
printf("\n");
return 0;
}