Pagini recente » Cod sursa (job #1483248) | Cod sursa (job #273542) | Cod sursa (job #583671) | Cod sursa (job #2747824) | Cod sursa (job #2080267)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 100005
#define lsb(x) (x & (-x))
using namespace std;
int a[NMAX], n;
vector<pair<int, int>> sort_v;
int norm_v[NMAX];
int p[NMAX], l[NMAX];
pair<int, int> aib[NMAX];
int dim;
void update(int pos, int pos_v) {
for (int i = pos; i <= dim; i += lsb(i)) {
if (l[pos_v] > aib[i].first)
aib[i] = make_pair(l[pos_v], pos_v);
}
}
pair<int, int> query(int pos) {
pair<int, int> max_v = make_pair(0, 0);
for (int i = pos; i > 0; i -= lsb(i)) {
if (aib[i].first > max_v.first)
max_v = aib[i];
}
return max_v;
}
void read() {
ifstream in("scmax.in");
in >> n;
for (int i = 1; i <= n; ++i) {
in >> a[i];
sort_v.push_back(make_pair(a[i], i));
}
in.close();
}
ofstream out("scmax.out");
void print(int n) {
if (n != 0) {
print(p[n]);
out << a[n] << " ";
}
}
int main() {
read();
sort(sort_v.begin(), sort_v.end());
dim = 1;
norm_v[sort_v[0].second] = dim;
for (unsigned int i = 1; i < sort_v.size(); i++) {
if (sort_v[i].first > sort_v[i - 1].first)
dim++;
norm_v[sort_v[i].second] = dim;
}
pair<int, int> res;
int length = 0, pos = 0;
for (int i = 1; i <= n; i++) {
res = query(norm_v[i] - 1);
l[i] = res.first + 1;
p[i] = res.second;
update(norm_v[i], i);
if (l[i] > length) {
length = l[i];
pos = i;
}
}
out << length << "\n";
print(pos);
out.close();
return 0;
}