Pagini recente » Cod sursa (job #2328398) | Cod sursa (job #2871484) | Cod sursa (job #2428579) | Cod sursa (job #2433908) | Cod sursa (job #3282823)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100005], dp[100005], parent[100005], lis_index[100005], top;
vector<int> lis;
void Add(int index)
{
int x = a[index];
int st = 1, dr = top, P = top + 1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (a[dp[mij]] >= x)
{
P = mij;
dr = mij - 1;
}
else st = mij + 1;
}
dp[P] = index;
lis_index[P] = index;
if (P > 1) parent[index] = lis_index[P - 1];
if (P > top) top = P;
}
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
{
fin >> a[i];
parent[i] = -1;
}
for (int i = 1; i <= n; i++)
Add(i);
fout << top << "\n";
int last_index = dp[top];
while (last_index != -1)
{
lis.push_back(a[last_index]);
last_index = parent[last_index];
}
reverse(lis.begin(), lis.end());
for (int num : lis)
fout << num << " ";
return 0;
}