Pagini recente » Cod sursa (job #913922) | Cod sursa (job #3199587) | Cod sursa (job #1017023) | Cod sursa (job #3000335) | Cod sursa (job #2930650)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> normalizare_sort(vector<int> &a);
int query(int nr, const vector<int> &aib);
void update(int nr, int lun, vector<int> &aib);
int main()
{
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
fin >> n;
vector<int> a(n);
for (auto &r : a)
fin >> r;
vector<int> norm = normalizare_sort(a);
vector<int> aib(n+1);
int sol = 0;
int isol = -1;
vector<int> lung(n);
for (int i = 0; i < n; ++i) {
int nr = norm[i];
int lun = query(nr-1, aib);
int curr = lun + 1;
if (curr > sol) {
sol = curr;
isol = i;
}
lung[i] = curr;
update(nr, curr, aib);
}
fout << sol << "\n";
vector<int> elem(sol);
while (sol > 0) {
elem[sol-1] = norm[isol];
sol--;
for (int j = isol-1; j >= 0; j--)
if (norm[j] < norm[isol] && lung[j] == sol) {
isol = j;
break;
}
}
for (auto i : elem)
fout << a[i-1] << ' ';
fout << "\n";
return 0;
}
vector<int> normalizare_sort(vector<int> &a)
{
vector<int> rezultat = a;
vector<int> b = a;
sort(b.begin(), b.end());
for (auto &r : rezultat) {
auto it = lower_bound(b.begin(), b.end(), r);
r = 1 + (it - b.begin());
}
a.swap(b);
return rezultat;
}
int query(int nr, const vector<int> &aib)
{
int rez = 0;
while (nr) {
rez = max(rez, aib[nr]);
//nr -= ((nr ^ (nr-1)) & nr);
nr = (nr & (nr-1));
}
return rez;
}
void update(int nr, int lun, vector<int> &aib)
{
int n = aib.size() - 1;
while (nr <= n) {
aib[nr] = max(aib[nr], lun);
nr += ((nr ^ (nr-1)) & nr);
}
}