Cod sursa(job #2071135)

Utilizator mlc_oficialBoris Barca mlc_oficial Data 20 noiembrie 2017 12:51:17
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.68 kb
#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>>, rb_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;
}