Cod sursa(job #794928)
#include <cstdio>
#define LGMAX 100003
using namespace std;
FILE *inFile = fopen ("scmax.in", "r");
FILE *outFile = fopen ("scmax.out", "w");
int n;
int length;
int a[LGMAX];
int s[LGMAX];
int lg[LGMAX];
int prev[LGMAX];
void read()
{
fscanf (inFile, "%d\n", &n);
for (int i = 1; i <= n; ++i)
fscanf (inFile, "%d ", &a[i]);
}
int search(int x)
{
int left = 0;
int right = length;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (a[s[mid]] < x && a[s[mid + 1]] >= x)
return mid;
else
if (a[s[mid + 1]] < x)
left = mid + 1;
else
right = mid - 1;
}
return length;
}
int solve()
{
lg[1] = s[1] = length = 1;
for (int i = 2; i <= n; ++ i)
{
int pos = search (a[i]);
prev[i] = s[pos];
lg[i] = pos + 1;
s[pos + 1] = i;
if (length < pos + 1)
length = pos + 1;
}
for (int i = n; i >= 1; -- i)
if (lg[i] == length)
return i;
return 0;
}
void print(int i)
{
if (prev[i] > 0)
print (prev[i]);
fprintf (outFile, "%d ", a[i]);
}
int main()
{
read();
int aux = solve();
fprintf (outFile, "%d\n", length);
print(aux);
return 0;
}