Pagini recente » Cod sursa (job #1975292) | Cod sursa (job #1078126) | Cod sursa (job #486311) | Cod sursa (job #2929269) | Cod sursa (job #3004210)
#include <stdio.h>
#include <stdlib.h>
#define N 100000
FILE *in, *out;
int v[N], lung[N], val_min[N+1];
int caut_bin(int vm[], int n, int x)
{
int st = 1, dr = n, rez = st - 1;
while (st <= dr)
{
int m = (st + dr) / 2;
if (vm[m] < x)
{
rez = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return rez;
}
void refac_subsir(int p, int val, int lg)
{
if (lg == 0)
{
return;
}
if (v[p] <= val && lung[p] == lg)
{
refac_subsir(p - 1, v[p] - 1, lg - 1);
fprintf(out, "%d ", v[p]);
}
else
{
refac_subsir(p - 1, val, lg);
}
}
int main()
{
in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
int n;
fscanf(in, "%d", &n);
for (int i = 0; i < n; i++)
{
fscanf(in, "%d", &v[i]);
}
int nr = 0, pmax = 0;
for (int i = 0; i < n; i++)
{
int l_0 = caut_bin(val_min, nr, v[i]);
if (l_0 == nr)
{
nr++;
}
val_min[l_0 + 1] = v[i];
lung[i] = l_0 + 1;
if (lung[i] >lung[pmax])
{
pmax = i;
}
}
fprintf(out, "%d\n", nr);
refac_subsir(pmax, v[pmax], lung[pmax]);
fclose(in);
fclose(out);
return 0;
}