Pagini recente » Cod sursa (job #1655576) | Borderou de evaluare (job #2289434) | Borderou de evaluare (job #1210318) | Cod sursa (job #383437) | Cod sursa (job #1822477)
#include <cstdio>
using namespace std;
int v[100005], q[100005], p[100005];
int bs(int st, int dr, int val) {
int last = 0, med;
while(st <= dr) {
med = (st + dr) / 2;
if(q[med] < val) {
last = med;
st = med + 1;
} else {
dr = med - 1;
}
}
return last + 1;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n, st, dr, aux;
scanf("%d", &n);
st = 1;
dr = 0;
for(int i = 1; i <= n; ++ i) {
scanf("%d", &v[i]);
aux = bs(st, dr, v[i]);
if(aux == dr + 1) {
++ dr;
}
q[aux] = v[i];
p[i] = aux;
}
printf("%d\n", dr);
aux = dr;
for(int i = n; i >= 1; -- i) {
if(p[i] == aux) {
q[aux] = v[i];
-- aux;
}
}
for(int i = 1; i <= dr; ++ i) {
printf("%d ", q[i]);
}
return 0;
}