Pagini recente » Cod sursa (job #1720774) | Cod sursa (job #1139532) | Cod sursa (job #664276) | Cod sursa (job #2790234) | Cod sursa (job #218581)
Cod sursa(job #218581)
// http://infoarena.ro/problema/scmax
#include <cstdio>
const int NMAX = 100000;
int A[NMAX], n;
int Pred[NMAX], Ind[NMAX], lMax;
int binarySearch(int key) {
int l = 0, r = lMax - 1, m;
while (l <= r) {
m = (r - l) / 2 + l;
if (key == A[Ind[m]])
return m;
if (key < A[Ind[m]])
r = m - 1;
else
l = m + 1;
}
return m;
}
void printSol(int i) {
if (i == -1)
return;
printSol(Pred[i]);
printf("%d ", A[i]);
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
int i;
for (i = 0; i < n; ++ i) {
scanf("%d", &A[i]);
Pred[i] = -1;
}
Ind[0] = 0;
int ind;
for (i = 1, lMax = 1; i < n; ++ i) {
ind = binarySearch(A[i]);
if (ind == lMax - 1 && A[i] > A[Ind[ind]]) {
Pred[i] = Ind[ind];
Ind[lMax] = i;
++ lMax;
} else {
if (ind == 0)
Pred[i] = -1;
else
Pred[i] = Ind[ind - 1];
Ind[ind] = i;
}
}
printf("%d\n", lMax);
printSol(Ind[lMax - 1]);
return 0;
}