Pagini recente » Cod sursa (job #2450138) | Cod sursa (job #1271864) | Cod sursa (job #937959) | Cod sursa (job #3036966) | Cod sursa (job #3331313)
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int N;
cin >> N;
vector<long long> a(N + 1);
for (int i = 1; i <= N; ++i) {
cin >> a[i];
}
vector<int> tail(N + 1, 0);
vector<int> par(N + 1, -1);
vector<int> poz(N + 1, 0);
int Lmax = 0;
int lastPos = 0;
for (int i = 1; i <= N; ++i) {
int st = 1, dr = Lmax, ans = 0;
while (st <= dr) {
int mid = (st + dr) / 2;
if (a[tail[mid]] < a[i]) {
ans = mid;
st = mid + 1;
} else {
dr = mid - 1;
}
}
int len = ans + 1;
poz[i] = len;
par[i] = (ans == 0 ? -1 : tail[ans]);
tail[len] = i;
if (len > Lmax) {
Lmax = len;
lastPos = i;
}
}
vector<long long> lis;
int cur = lastPos;
while (cur != -1) {
lis.push_back(a[cur]);
cur = par[cur];
}
reverse(lis.begin(), lis.end());
cout << Lmax << "\n";
for (int i = 0; i < (int)lis.size(); ++i) {
cout << lis[i] << (i + 1 == (int)lis.size() ? '\n' : ' ');
}
return 0;
}