Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ucontext.h>
- #include <algorithm>
- #include <functional>
- #include <iostream>
- #include <memory>
- #include <set>
- #include <vector>
- using ucontext_ptr =
- std::unique_ptr<ucontext_t, std::function<void(ucontext_t*)>>;
- ucontext_ptr new_context() {
- auto* ctx = new ucontext_t;
- ctx->uc_stack.ss_sp = new char[42424242];
- ctx->uc_stack.ss_size = 42424242;
- ctx->uc_stack.ss_flags = 0;
- ctx->uc_link = nullptr;
- return ucontext_ptr(ctx, [](ucontext_t* ctx) {
- auto* stack = static_cast<char*>(ctx->uc_stack.ss_sp);
- delete[] stack;
- delete ctx;
- });
- }
- void restoreSortedIDs(std::vector<int>& v, size_t d) {
- std::set<int, std::less<int>> subsequence;
- auto i = std::make_unique<int>(0);
- auto loop_ctx = new_context();
- getcontext(loop_ctx.get());
- subsequence.insert(v[*i]);
- *i = *i + 1;
- if (*i <= d) {
- setcontext(loop_ctx.get());
- }
- auto insert_index = std::make_unique<int>(0);
- auto pq_index = std::make_unique<int>(d + 1);
- getcontext(loop_ctx.get());
- v[*insert_index] = *subsequence.begin();
- subsequence.erase(subsequence.begin());
- subsequence.insert(v[*pq_index]);
- *insert_index = *insert_index + 1;
- *pq_index = *pq_index + 1;
- if (*pq_index < v.size()) {
- setcontext(loop_ctx.get());
- }
- getcontext(loop_ctx.get());
- v[*insert_index] = *subsequence.begin();
- *insert_index = *insert_index + 1;
- subsequence.erase(subsequence.begin());
- if (!subsequence.empty()) {
- setcontext(loop_ctx.get());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement