Pagini recente » Cod sursa (job #366048) | Cod sursa (job #1436342) | Cod sursa (job #602087) | Cod sursa (job #977765) | Cod sursa (job #3349221)
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<long long> a(N);
for (int i = 0; i < N; i++) cin >> 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
cout << len << "\n";
for (auto x : lis)
cout << x << " ";
cout << "\n";
return 0;
}