ivolff

Untitled

Oct 9th, 2020
1,055
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <algorithm>
  2. #include <execution>
  3. #include <random>
  4. #include <iostream>
  5. #include <vector>
  6. #include <cmath>
  7.  
  8. int counter = 0;
  9.  
  10. struct Request {
  11.     int left;
  12.     int right;
  13. };
  14.  
  15. struct node{
  16. public:
  17.     int L, R, val;
  18.  
  19.     node(int L = -1, int R = -1, int val = INT32_MAX){
  20.         this->L = L;
  21.         this->R = R;
  22.         this->val = val;
  23.     }
  24.  
  25.     ~node() = default;
  26. };
  27.  
  28. std::vector<node> tree;
  29.  
  30. int init_node(int indx, int L, int R, const std::vector<int>& init_array){
  31.     if (L == R) {
  32.         if (counter < init_array.size())
  33.             tree[indx] = {L, R, init_array[counter]};
  34.         else
  35.             tree[indx] = {L, R, INT32_MAX};
  36.         counter++;
  37.         return tree[indx].val;
  38.     }
  39.     int l = init_node(indx * 2 + 1, L,L + (R - L) / 2 , init_array);
  40.     int r = init_node(indx * 2 + 2, L + (R - L) / 2  + 1, R, init_array);
  41.     tree[indx] = node(L,R, std::min(l,r));
  42.     return tree[indx].val;
  43. }
  44.  
  45. void init(const std::vector<int>& init_array) {
  46.     int n = log2(init_array.size());
  47.     if ( 1 << n != init_array.size())
  48.         n ++;
  49.     int K = 1 << n;
  50.     tree.resize(K*2 - 1);
  51.     int a = init_node(0, 0, K - 1, init_array);
  52.     tree[0] = {0, K - 1, a};
  53. }
  54.  
  55. int gets(int indx, int L, int R) {
  56.     if (R >= tree[indx].R && L <= tree[indx].L)
  57.         return tree[indx].val;
  58.     if (R < tree[indx].L || L > tree[indx].R)
  59.         return INT32_MAX;
  60.     return std::min(gets(indx * 2 + 1, L, R), gets(indx * 2 + 2, L, R));
  61. }
  62.  
  63. int get(Request req) {
  64.     return gets(0, req.left, req.right - 1);
  65. }
  66.  
  67.  
  68. std::vector<int> ProcessRequests(const std::vector<int>& numbers, const std::vector<Request>& requests){
  69.     std::vector<int> ans(requests.size());
  70.     init(numbers);
  71.     std::transform(std::execution::par, requests.begin(), requests.end(), ans.begin(), [](Request r){return get(r);});
  72.     return ans;
  73.  
  74. }
Advertisement
Add Comment
Please, Sign In to add comment