Pagini recente » Cod sursa (job #3332022) | Borderou de evaluare (job #3331277) | Cod sursa (job #3343409) | Cod sursa (job #2107243) | Cod sursa (job #3341191)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 1e5 + 1, INF = INT_MAX;
int n, arr[NMAX], dp[NMAX], parent[NMAX], idx[NMAX];
void print(int length)
{
if(length == 1)
{
fout << arr[idx[length]] << " ";
return;
}
print(length - 1);
fout << arr[idx[length]] << " ";
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++)
fin >> arr[i];
fill(dp + 1, dp + n + 1, INF);
dp[0] = -INF;
for(int i = 1; i <= n; i++)
{
int l = upper_bound(dp + 1, dp + n + 1, arr[i]) - dp;
if(dp[l-1] < arr[i] && arr[i] < dp[l])
{
dp[l] = arr[i];
idx[l] = i;
parent[l] = idx[l - 1];
}
}
int max_length = -1;
for(int i = 1; i <= n; i++)
if(dp[i] != INF && i > max_length)
max_length = i;
fout << max_length << "\n";
print(max_length);
fin.close();
fout.close();
return 0;
}