Pagini recente » Cod sursa (job #1735613) | Cod sursa (job #2536314) | Cod sursa (job #2702812) | Cod sursa (job #2747015) | Cod sursa (job #2676447)
#include <stdio.h>
#include <stdlib.h>
#define N 100000
int v[N], l[N], n, vmin[N], lmax;
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 caut_binar(int val)
{
///returneaza j maxim cu proprietatea ca exista vmin[j] < val
if (vmin[lmax] < val)
{
return lmax;
}
int st = 1, dr = lmax;
while (st < dr)
{
int m = (st + dr) / 2;
if (vmin[m] >= val)
{
dr = m;
}
else
{
st = m + 1;
}
}
return st - 1;///pe poz st se afla j minim cu vmin[j] >= val
}
int main()
{
in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
fscanf(in, "%d", &n);
int i, imax = 0;
for (i = 0; i < n; i++)
{
fscanf(in, "%d", &v[i]);
}
fclose(in);
l[0] = 1;
vmin[++lmax] = v[0];
for (i = 1; i < n; i++)
{
int j = caut_binar(v[i]);
vmin[j+1] = v[i];
if (j == lmax)
{
++lmax;
}
l[i] = j + 1;
if (l[i] > l[imax])
{
imax = i;
}
}
fprintf(out, "%d\n", l[imax]);///lmax = l[imax]
subsir(imax);
fclose(out);
return 0;
}