Pagini recente » clasament-arhiva-monthly | Cod sursa (job #2306161) | Borderou de evaluare (job #680147) | Cod sursa (job #2802702) | Cod sursa (job #1984605)
#include <bits/stdc++.h>
const int MAXN = 100000;
using namespace std;
int v[MAXN + 1], sol[MAXN + 1], poz[MAXN + 1], scm[MAXN + 1];
int main()
{
FILE *fin, *fout;
int n, i, nr, st, dr, mm, m;
fin = fopen ("scmax.in", "r");
fout = fopen ("scmax.out", "w");
fscanf (fin, "%d", &n);
for (i = 1; i <= n; i++)
fscanf (fin, "%d", &v[i]);
sol[1] = v[1];
poz[1] = 1;
nr = 1;
for (i = 2; i <= n; i++) {
if (v[i] > sol[nr]) {
nr++;
sol[nr] = v[i];
poz[i] = nr;
}
else {
st = 1;
dr = nr;
mm = -1;
while (st <= dr) {
m = (st + dr) / 2;
if (sol[m] > v[i]) {
dr = m - 1;
mm = m;
}
else {
st = m + 1;
}
}
sol[mm] = v[i];
poz[i] = mm;
}
}
i = n;
n = nr;
while (nr > 0) {
if (poz[i] == nr) {
scm[nr] = v[i];
nr--;
}
i--;
}
fprintf (fout, "%d\n", n);
for (i = 1; i <= n; i++)
fprintf (fout, "%d ", scm[i]);
fclose (fin);
fclose (fout);
return 0;
}