Pagini recente » Cod sursa (job #2764105) | Cod sursa (job #1745304) | Cod sursa (job #62809) | Cod sursa (job #3259019) | Cod sursa (job #1925479)
#include <fstream>
using namespace std;
int n, nes, gasit, i, j, e, ind[100001], a[100001], p[100001], s[100001];
int cb (int v) {
int s = 1, d = nes, m;
do {
m = (s + d) / 2;
if (a[ind[m]] < v and v < a[ind[m+1]])
return m + 1;
else
if (v < a[ind[m]])
d = m - 1;
else
s = m + 1;
} while (s <= d);
return 1;
}
int main () {
ifstream fi ("scmax.in");
ofstream fo ("scmax.out");
fi >> n;
for (i = 1; i <= n; i++)
fi >> a[i];
nes = 1; ind[1] = 1; // numarul de elemente din subsir
for (i = 2; i <= n; i++) {
if (a[i] > a[ind[nes]]) {
p[i] = ind[nes]; nes++; ind[nes] = i;
}
else {
gasit = cb(a[i]);
p[i] = ind[gasit-1];
ind[gasit] = i;
}
}
fo << nes << '\n';
for (i = ind[nes], j = 1; j <= nes; i = p[i], j++)
s[j] = a[i];
for (i = nes; i >= 1; i--)
fo << s[i] << ' ';
return 0;
}