Pagini recente » Cod sursa (job #1882098) | Cod sursa (job #871925) | Cod sursa (job #638624) | Cod sursa (job #104327) | Cod sursa (job #2071133)
#include <fstream>
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<class ConstNodeIterator, class NodeIterator, class Less, class Allocator>
class NodeUpdate {
public:
typedef typename NodeIterator::value_type iterator;
struct metadata_type {
int size, mx;
metadata_type() : size(0), mx(0) {}
};
template<class T>
int order_of_key(const T& key) const {
NodeIterator it = node_begin();
ConstNodeIterator end = node_end();
int answer = 0;
while (it != end) {
if (Less()(**it, key)) {
answer += 1;
if (it.get_l_child() != end) {
answer += it.get_l_child().get_metadata().size;
}
it = it.get_r_child();
} else {
it = it.get_l_child();
}
}
return answer;
}
iterator find_by_order(int pos) {
pos++;
NodeIterator it = node_begin();
ConstNodeIterator end = node_end();
while (it != end) {
int size = 1;
if (it.get_l_child() != end) {
size += it.get_l_child().get_metadata().size;
}
if (size == pos) {
return *it;
} else if (size > pos) {
it = it.get_l_child();
} else {
pos -= size;
it = it.get_r_child();
}
}
return end();
}
protected:
void operator()(NodeIterator it, ConstNodeIterator end) {
metadata_type val;
val.size = 1;
if (it.get_l_child() != end) {
val.size += it.get_l_child().get_metadata().size;
val.mx = it.get_l_child().get_metadata().mx;
}
val.mx = max(val.mx, (**it).first + val.size);
if (it.get_r_child() != end) {
val.mx = max(val.mx, it.get_r_child().get_metadata().mx + val.size);
val.size += it.get_r_child().get_metadata().size;
}
(metadata_type&) it.get_metadata() = val;
}
virtual ConstNodeIterator node_begin() const = 0;
virtual ConstNodeIterator node_end() const = 0;
virtual iterator end() const = 0;
};
typedef tree<pair<int, int>, null_type, less<pair<int, int>>, splay_tree_tag, NodeUpdate> Set;
int main() {
#ifdef INFOARENA
ifstream cin("algsort.in");
ofstream cout("algsort.out");
#endif
Set s;
int n; cin >> n;
for (int i = 0; i < n; i += 1) {
int x; cin >> x;
s.insert(make_pair(x, i));
}
for (auto&& key : s) {
cout << key.first << ' ';
}
cout << endl;
}