Pagini recente » Cod sursa (job #121207) | Cod sursa (job #1580224) | Cod sursa (job #1180891) | Cod sursa (job #6146) | Cod sursa (job #1647611)
#include<stdio.h>
using namespace std;
const int N = 100005;
FILE *in = fopen ("scmax.in", "r"),
*out = fopen ("scmax.out", "w");
int v[N], s[N], nr, pre[N];
int cautBin (int x, int n)
{
int pas = 1, sol = 0;
while (pas <= n)
pas <<= 1;
pas >>= 1;
while (pas > 0)
{
if (sol + pas <= n && v[s[sol + pas]] < x)
sol += pas;
pas >>= 1;
}
return sol + 1;
}
void afisare (int p)
{
if (pre[p] == 0)
{
fprintf (out, "%d ", v[p]);
return;
}
afisare (pre[p]);
fprintf (out, "%d ", v[p]);
}
int main ()
{
int n;
fscanf (in, "%d", &n);
int i;
for (i = 1; i <= n; i++)
fscanf (in, "%d", &v[i]);
s[++nr] = 1;
int p;
for (i = 2; i <= n; i++)
{
if (v[s[nr]] >= v[i])
{
p = cautBin (v[i], nr);
s[p] = i;
pre[i] = s[p - 1];
}
else
{
s[++nr] = i;
pre[i] = s[nr - 1];
}
}
fprintf (out, "%d\n", nr);
afisare (s[nr]);
return 0;
}