Pagini recente » Cod sursa (job #405486) | Cod sursa (job #242760) | Cod sursa (job #751244) | Cod sursa (job #2785418) | Cod sursa (job #536739)
Cod sursa(job #536739)
# include <cstdio>
# include <cstdlib>
# define mare 2000000000
using namespace std;
typedef int vector[100001];
vector v, p, q;
int *s, n, nq;
void citire (){
freopen ("scmax.in", "rt", stdin);
scanf ("%d", &n);
for (int i = 1; i <= n; ++i)
scanf ("%d", &v[i]);
}
int cb (int in, int sf, int find){
int ret = nq + 1;
while (in <= sf){
int m = (in + sf) / 2;
if (q[m] >= find){
ret = m;
sf = m - 1;
}
else
in = m + 1;
}
q[ret] = find;
return ret;
}
//UNION
void crpq (){
q[1] = mare;
nq = 1;
for (int i = 1; i <= n; ++i){
p[i] = cb (1, nq + 1, v[i]);
nq = (nq > p[i] ? nq : p[i]);
q[nq + 1] = mare;
}
}
void csol (){
int i, k = n;
s = (int * ) calloc (nq + 1, sizeof (int) );
for (i = nq; i > 0; --i){
while (p[k] != i) --k;
* (s + i) = v[k];
}
}
void wsol (){
freopen ("scmax.out", "wt", stdout);
printf ("%d\n", nq);
for (int i = 1; i <= nq; ++i)
printf ("%d ", * (s + i) );
}
int main (){
citire ();
crpq ();
csol ();
wsol ();
return 0;
}