Pagini recente » Cod sursa (job #2765091) | Cod sursa (job #486843) | Cod sursa (job #1318158) | Cod sursa (job #2284703) | Cod sursa (job #1362357)
#include <cstdio>
using namespace std;
const int MAXN = 100003;
int x[MAXN];
int m[MAXN];
int p[MAXN];
int sol[MAXN];
int main()
{
FILE *in = fopen("scmax.in", "r");
FILE *out = fopen("scmax.out", "w");
int n;
fscanf(in, "%d", &n);
for (int i = 1; i <= n; ++i)
fscanf(in, "%d", &x[i]);
int l = 1;
m[1] = 1;
for (int i = 2; i <= n; ++i)
{
int left = 1;
int right = l;
while (left <= right)
{
int mid = (left+right+1)/2;
if (x[m[mid]] < x[i])
left = mid+1;
else
right = mid-1;
}
p[i] = m[left-1];
m[left] = i;
if (left > l)
l = left;
}
int k = m[l];
int q = 0;
while (k != 0)
{
sol[++q] = x[k];
k = p[k];
}
fprintf(out, "%d\n", l);
fprintf(out, "%d", sol[q]);
for (int i = q-1; i > 0; --i)
fprintf(out, " %d", sol[i]);
fprintf(out, "\n");
return 0;
}