Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1.   #include <ucontext.h>
  2.   #include <algorithm>
  3.   #include <functional>
  4.   #include <iostream>
  5.   #include <memory>
  6.   #include <set>
  7.   #include <vector>
  8.  
  9.   using ucontext_ptr =
  10.       std::unique_ptr<ucontext_t, std::function<void(ucontext_t*)>>;
  11.  
  12.   ucontext_ptr new_context() {
  13.     auto* ctx = new ucontext_t;
  14.     ctx->uc_stack.ss_sp = new char[42424242];
  15.     ctx->uc_stack.ss_size = 42424242;
  16.     ctx->uc_stack.ss_flags = 0;
  17.     ctx->uc_link = nullptr;
  18.  
  19.     return ucontext_ptr(ctx, [](ucontext_t* ctx) {
  20.       auto* stack = static_cast<char*>(ctx->uc_stack.ss_sp);
  21.       delete[] stack;
  22.       delete ctx;
  23.     });
  24.   }
  25.  
  26.   void restoreSortedIDs(std::vector<int>& v, size_t d) {
  27.     std::set<int, std::less<int>> subsequence;
  28.  
  29.     auto i = std::make_unique<int>(0);
  30.     auto loop_ctx = new_context();
  31.     getcontext(loop_ctx.get());
  32.     subsequence.insert(v[*i]);
  33.     *i = *i + 1;
  34.     if (*i <= d) {
  35.       setcontext(loop_ctx.get());
  36.     }
  37.  
  38.     auto insert_index = std::make_unique<int>(0);
  39.     auto pq_index = std::make_unique<int>(d + 1);
  40.     getcontext(loop_ctx.get());
  41.     v[*insert_index] = *subsequence.begin();
  42.     subsequence.erase(subsequence.begin());
  43.     subsequence.insert(v[*pq_index]);
  44.     *insert_index = *insert_index + 1;
  45.     *pq_index = *pq_index + 1;
  46.     if (*pq_index < v.size()) {
  47.       setcontext(loop_ctx.get());
  48.     }
  49.  
  50.     getcontext(loop_ctx.get());
  51.     v[*insert_index] = *subsequence.begin();
  52.     *insert_index = *insert_index + 1;
  53.     subsequence.erase(subsequence.begin());
  54.     if (!subsequence.empty()) {
  55.       setcontext(loop_ctx.get());
  56.     }
  57.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement