Pagini recente » Cod sursa (job #2530046) | Cod sursa (job #1184057) | Cod sursa (job #1937624) | Cod sursa (job #2659843) | Cod sursa (job #3277246)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int NMAX = 100001;
int v[NMAX], last[NMAX], parent[NMAX], lg[NMAX];
int maxLength = 0;
int findMaxIncreasingLength(int i)
{
int p = 0, u = maxLength, ans = -1;
while (p <= u)
{
int mid = (p + u) / 2;
if (v[last[mid]] < v[i])
{
ans = mid;
p = mid + 1;
}
else
{
u = mid - 1;
}
}
return ans;
}
void printSubsequence(int poz)
{
if (poz == 0)
{
return;
}
printSubsequence(last[lg[poz] - 1]);
g << v[poz] << ' ';
}
int main()
{
int n;
f >> n;
for (int i = 1; i <= n; i++)
{
f >> v[i];
}
parent[1] = 0;
lg[1] = 1;
last[1] = 1;
int lastPos = 0;
for (int i = 2; i <= n; i++)
{
int currentLength = findMaxIncreasingLength(i);
lg[i] = currentLength + 1;
last[currentLength + 1] = i;
parent[i] = last[currentLength];
if (lg[i] > maxLength)
{
lastPos = i;
maxLength = lg[i];
}
}
g << maxLength << '\n';
printSubsequence(lastPos);
return 0;
}