Pagini recente » Cod sursa (job #602862) | Cod sursa (job #3347146) | Cod sursa (job #3347524) | Cod sursa (job #2328004) | Cod sursa (job #3339413)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, v[100001], i, j, dp[100001], maxim;
int aib[100001], pos_aib[100001], tata[100001];
pair<int, int> temp[100001];
int norm_v[100001];
vector<int> drum;
void update(int idx, int val, int poz_originala) {
for (; idx <= n; idx += idx & -idx) {
if (val > aib[idx]) {
aib[idx] = val;
pos_aib[idx] = poz_originala;
}
}
}
pair<int, int> query(int idx) {
int res = 0, ultima_poz = 0;
for (; idx > 0; idx -= idx & -idx) {
if (aib[idx] > res) {
res = aib[idx];
ultima_poz = pos_aib[idx];
}
}
return {res, ultima_poz};
}
int main() {
in >> n;
for (i = 1; i <= n; ++i) {
in >> v[i];
temp[i] = {v[i], i};
}
sort(temp + 1, temp + n + 1);
int rang = 1;
for (i = 1; i <= n; ++i) {
if (i > 1 && temp[i].first > temp[i - 1].first) rang++;
norm_v[temp[i].second] = rang;
}
int poz_finala = 0;
for (i = 1; i <= n; ++i) {
pair<int, int> cel_mai_bun = query(norm_v[i] - 1);
dp[i] = cel_mai_bun.first + 1;
tata[i] = cel_mai_bun.second;
update(norm_v[i], dp[i], i);
if (dp[i] > maxim) {
maxim = dp[i];
poz_finala = i;
}
}
out << maxim << '\n';
int curr = poz_finala;
while (curr > 0) {
drum.push_back(v[curr]);
curr = tata[curr];
}
reverse(drum.begin(), drum.end());
for (auto x : drum) out << x << ' ';
return 0;
}