Pagini recente » Cod sursa (job #3302383) | Cod sursa (job #699845) | Cod sursa (job #1029047) | Cod sursa (job #1932159) | Cod sursa (job #3349224)
#include <bits/stdc++.h>
using namespace std;
int tail[100005];
int pos[100005];
int parent[100005];
int main()
{
ifstream fin("scmax.in");
ofstream fout("scmax.out");
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
int N;
fin >> N;
vector<long long> a(N);
for (int i = 0; i < N; i++)
fin >> a[i];
// vector<long long> tail(N);
// vector<int> pos(N);
// vector<int> prev(N, -1);
for (int i = 0; i < N + 5; i++)
parent[i] = -1;
int len = 0; // lungimea LIS
for (int i = 0; i < N; i++) {
// cautam prima pozitie unde tail[p] >= a[i]
int p = lower_bound(tail, tail + len, a[i]) - tail;
tail[p] = a[i];
pos[p] = i;
if (p > 0)
parent[i] = pos[p - 1];
if (p == len)
len++;
}
// reconstructie
vector<long long> lis;
int cur = pos[len - 1];
while (cur != -1) {
lis.push_back(a[cur]);
cur = parent[cur];
}
reverse(lis.begin(), lis.end());
// output
fout << len << "\n";
for (auto x : lis)
fout << x << " ";
// cout << "\n";
return 0;
}