Pagini recente » Cod sursa (job #2446708) | Cod sursa (job #1829008) | Cod sursa (job #1336662) | Cod sursa (job #2501975) | Cod sursa (job #3349222)
#include <bits/stdc++.h>
using namespace std;
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);
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.begin(), tail.begin() + len, a[i]) - tail.begin();
tail[p] = a[i];
pos[p] = i;
if (p > 0)
prev[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 = prev[cur];
}
reverse(lis.begin(), lis.end());
// output
fout << len << "\n";
for (auto x : lis)
fout << x << " ";
// cout << "\n";
return 0;
}