Pagini recente » Cod sursa (job #489525) | Cod sursa (job #861635) | Cod sursa (job #860525) | Cod sursa (job #193830) | Cod sursa (job #2704411)
#include <stdio.h>
#include <stdlib.h>
#define N 100000
int v[N], l[N], vmin[1+N], n, m;
FILE *in, *out;
int caut_bin(int x)
{
//caut cel mai mic p cu propr vmin[p] >= x
if (vmin[m] < x)
{
return m + 1;
}
int st = 1, dr = m;
while (st < dr)
{
int mij = (st + dr) / 2;
if (vmin[mij] >= x)
{
dr = mij;
}
else
{
st = mij + 1;
}
}
return st;
}
void subsirul(int poz)
{
int i = poz - 1;
while (i >= 0 && l[i] != l[poz] - 1)
{
i--;
}
if (i >= 0)
{
subsirul(i);
}
fprintf(out, "%d ", v[poz]);
}
int main()
{
in = fopen("scmax.in", "r");
out = fopen("scmax.out", "w");
fscanf(in, "%d", &n);
int i, k, pozm;
for (i = 0; i < n; i++)
{
fscanf(in, "%d", &v[i]);
}
fclose(in);
vmin[++m] = v[0];
l[0] = 1;
pozm = 0;
for (i = 1; i < n; i++)
{
k = caut_bin(v[i]);
vmin[k] = v[i];
l[i] = k;
if (k > m)
{
m++;
pozm = i;
}
}
fprintf(out, "%d\n", m);
subsirul(pozm);
fclose(out);
return 0;
}