Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <math.h>
  4.  
  5. template<typename T>
  6. void Swap(T& a, T& b) {
  7.   T temp = a;
  8.   a = b;
  9.   b = temp;
  10. }
  11.  
  12. template <typename T>
  13. int Partition(T* arr, int left_border, int right_border) {
  14.   int pivot_index = right_border - 1;
  15.   int piece_size = right_border - left_border;
  16.  
  17.   int random_index = left_border + std::rand() % piece_size;
  18.   Swap(arr[random_index], arr[pivot_index]);
  19.  
  20.   int i = left_border;
  21.   int j = left_border;
  22.   while (j < pivot_index) {
  23.     if (arr[j] > arr[pivot_index]) {
  24.       ++j;
  25.     } else {
  26.       Swap(arr[i], arr[j]);
  27.       ++i;
  28.       ++j;
  29.     }
  30.   }
  31.  
  32.   Swap(arr[i], arr[pivot_index]);
  33.  
  34.   return i;
  35. }
  36.  
  37. template <typename T>
  38. T GetKthOrderStatistic(T* arr, int size, int k) {
  39.   int left_border = 0;
  40.   int right_border = size;
  41.   int pivot_index = -1;
  42.  
  43.   while (k != pivot_index) {
  44.     pivot_index = Partition(arr, left_border, right_border);
  45.     if (k < pivot_index) {
  46.       right_border = pivot_index;
  47.     } else if (k > pivot_index) {
  48.       left_border = pivot_index + 1;
  49.     }
  50.   }
  51.  
  52.   return arr[k];
  53. }
  54.  
  55. template <typename T>
  56. T* GenerateSequence(T a0, T a1, int size) {
  57.   T* arr = new T [size];
  58.  
  59.   arr[0] = a0;
  60.   arr[1] = a1;
  61.   for (int i = 2; i < size; ++i) {
  62.     arr[i] = (arr[i - 1] * 123 + arr[i - 2] * 45) % (static_cast<int>(pow(10, 7)) + 4321);
  63.   }
  64.  
  65.   return arr;
  66. }
  67.  
  68. template <typename T>
  69. void DeleteArray(T* arr) {
  70.   delete[] arr;
  71. }
  72.  
  73. int main() {
  74.   int arr_size = 0;
  75.   int index_for_order_statistic = 0;
  76.   int a0 = 0;
  77.   int a1 = 0;
  78.  
  79.   std::cin >> arr_size >> index_for_order_statistic >> a0 >> a1;
  80.  
  81.   int* arr = GenerateSequence(a0, a1, arr_size);
  82.  
  83.   std::cout << GetKthOrderStatistic(arr, arr_size, index_for_order_statistic - 1);
  84.  
  85.   DeleteArray(arr);
  86.  
  87.   return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement