Pagini recente » Cod sursa (job #2361593) | Cod sursa (job #1837499) | Cod sursa (job #2041814) | Cod sursa (job #1260786) | Cod sursa (job #2949263)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, dp[100005], before[100005], numbers[100005];
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
fin >> numbers[i];
int ans = 0, ansIndex = 0;
for (int i = 1; i <= n; i++)
{
int left = 1, right = ans, mid;
while (left <= right)
{
mid = (left + right) / 2;
if (numbers[dp[mid]] < numbers[i])
left = mid + 1;
else
right = mid - 1;
}
before[i] = dp[left - 1];
dp[left] = i;
if (left > ans)
{
ans = left;
ansIndex = i;
}
}
fout << ans << "\n";
int ansStack[100005], top = 0;
while (ansIndex)
{
ansStack[++top] = numbers[ansIndex];
ansIndex = before[ansIndex];
}
while (top)
fout << ansStack[top--] << " ";
fout << "\n";
return 0;
}