Pagini recente » Cod sursa (job #154604) | Cod sursa (job #400988) | Cod sursa (job #1148702) | Cod sursa (job #105198) | Cod sursa (job #543822)
Cod sursa(job #543822)
#include <cstdio>
#include <cstdlib>
#define mare 0x3fffffff
using namespace std;
typedef int vector [100001];
vector v, p, q;
int *s, n, nq;
void citire()
{ freopen ("scmax.in", "r", stdin); freopen ("scmax.out", "w", stdout);
scanf ("%d", &n); for (int i = 1; i <= n; ++i) scanf ("%d", &v[i]);
}
int caut_bin (int k, int x, int y)
{ int mij = (x + y) / 2;
if (x == y)
{ if (y > nq) q[++nq + 1] = mare;
q[x] = k;
return x;
}
else
if (k <= q[mij]) return caut_bin (k, x, mij);
else return caut_bin (k, mij+1, y);
}
void creare_pq()
{ nq = 0;
q[1] = mare;
for (int i = 1; i <= n; ++i)
p[i] = caut_bin (v[i], 1, nq+1);
}
void caut_sol()
{ int i, k = n;
s = (int *) calloc (nq + 1, sizeof(int));
for (i = nq; i; --i)
{ while (p[k] != i) --k;
*(s + i) = v[k];
}
}
void scriu_sol()
{ printf ("%d\n", nq);
for (int i = 1; i <= nq; ++i)
printf ("%d ", *(s+i));
printf ("\n");
}
int main()
{ citire();
creare_pq();
caut_sol();
scriu_sol();
return 0;
}