Pagini recente » Cod sursa (job #2042058) | Cod sursa (job #553217) | Cod sursa (job #288967) | Cod sursa (job #806004) | Cod sursa (job #2674807)
#include <stdio.h>
#include <stdlib.h>
#define N 100000
int v[N], l[N], vmin[1+N], n, m;
FILE *in, *out;
void subsir(int p)
{
int i = p - 1;
while (i >= 0 && (v[i] >= v[p] || l[i] != l[p] - 1))///n-am gasit predecesorul lui v[p]
{
i--;
}
if (i >= 0)
{
subsir(i);
}
fprintf(out, "%d ", v[p]);
}
int cautbin(int x)
{
///caut cel mai mic j cu vmin[j] >= x
if (x > vmin[m])
{
return 1 + m;
}
int st = 1, dr = m;
while (st < dr)
{
int mijloc = (st + dr) / 2;
if (vmin[mijloc] >= x)
{
dr = mijloc;
}
else
{
st = mijloc + 1;
}
}
return st;
}
int main()
{
in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
fscanf(in, "%d", &n);
for (int i = 0; i < n; i++)
{
fscanf(in, "%d", &v[i]);
}
fclose(in);
l[0] = 1;
vmin[++m] = v[0];
for (int i = 1; i < n; i++)
{
int j = cautbin(v[i]);
l[i] = j;
if (j > m)
{
m++;
}
vmin[j] = v[i];
}
fprintf(out, "%d\n", m);
int imax = n - 1;
while (imax >= 0 && l[imax] != m)
{
imax--;
}
subsir(imax);
fclose(out);
return 0;
}