Pagini recente » Cod sursa (job #2741557) | Cod sursa (job #2436941) | Cod sursa (job #2036938) | Cod sursa (job #750171) | Cod sursa (job #2199877)
#include <fstream>
#include <stdio.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, i, nr, p[100002], u[100002], v[100002], sol[100002];
int caut(int x) {
int stg = 1, dr =nr;
int mij;
if (u[dr] < x)
return (nr + 1);
if (u[1] >= x)
return 1;
while (stg <= dr) {
mij = (stg + dr) / 2;
if (u[mij] < x) {
if (u[mij + 1] >= x)
return (mij + 1);
else
stg = mij + 1;
}
else {
dr = mij - 1;
}
}
}
int main() {
int poz;
f >> n;
for (i = 1; i <= n; ++i)
f >> v[i];
p[1] = 1;
u[1] = v[1];
nr = 1;
printf("%d\n", nr);
fflush(stdout);
for (i = 2; i <= n; ++i) {
poz = caut(v[i]);
p[i] = poz;
u[poz] = v[i];
if (poz > nr)
++nr;
}
g << nr << '\n';
i = n;
int m = nr;
int l = 0;
sol[0] = 2000000001;
while (m > 0) {
while (p[i] != m || v[i] >= sol[l]) {
--i;
}
++l;
sol[l] = v[i];
--m;
--i;
}
for (i = 1; i <= nr; ++i)
g << sol[i] << ' ';
g << '\n';
return 0;
}