Advertisement
Guest User

Untitled

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