Pagini recente » Cod sursa (job #2634113) | Cod sursa (job #539935) | Cod sursa (job #2204407) | Cod sursa (job #1701827) | Cod sursa (job #2943843)
#include <stdio.h>
#include <stdint.h>
void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
uint8_t ch;
*nr = 0;
while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
*nr *= 10;
*nr += ch - '0';
}
if (ch == '\r') {
fgetc(stream);
}
}
uint32_t __inline__ __attribute((pure)) max(uint32_t o1, uint32_t o2) {
return o1 > o2 ? o1 : o2;
}
uint32_t a[100002];
uint32_t m[100002];
uint32_t l[100002];
uint32_t bsrc(uint32_t *__restrict vec, uint32_t lbound, uint32_t ubound, uint32_t threshold) {
uint32_t cpos;
uint32_t answer = lbound - 1;
while (lbound <= ubound) {
cpos = (ubound + lbound) / 2;
if (vec[cpos] < threshold) {
answer = cpos;
lbound = cpos + 1;
} else {
ubound = cpos - 1;
}
}
return answer;
}
uint32_t n;
void ps(uint32_t i, uint32_t pv, uint32_t pl, FILE *__restrict out) {
if (i == 0) {
return;
}
if (a[i] < pv && l[i] == pl) {
ps(i - 1, a[i], pl - 1, out);
fprintf(out, "%u ", a[i]);
} else {
ps(i - 1, pv, pl, out);
}
}
int main(void) {
{
FILE *__restrict in = fopen("scmax.in", "r");
read_uint32_t(in, &n);
{
int32_t i;
for(i = 0; i < n; ++i) {
read_uint32_t(in, a + i);
}
}
fclose(in);
}
uint32_t cl = 1;
l[0] = 1;
m[1] = a[0];
{
int32_t i, h;
for(i = 1; i < n; ++i) {
h = bsrc(m, 1, cl, a[i]) + 1;
m[h] = a[i];
cl = max(cl, h);
l[i] = h;
}
}
uint32_t ma = 0;
uint32_t p = 0;
{
int32_t i;
for(i = 0; i < n; ++i) {
//fprintf(stdout, "%2u %2u %2u\n", a[i], l[i], m[i]);
if (l[i] > ma) {
ma = l[i];
p = i;
}
}
}
{
FILE *__restrict out = fopen("scmax.out", "w");
fprintf(out, "%u\n", ma);
ps(p, a[p] + 1, ma, out);
fclose(out);
}
return 0;
}