Advertisement
Guest User

Untitled

a guest
May 19th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. void print(const std::vector<int>& a) {
  5. for (int x : a) {
  6. std::cout << x << ' ';
  7. }
  8. std::cout << '\n';
  9. }
  10.  
  11. void print(const std::vector<std::vector<std::pair<int, int>>>& a) {
  12. for (const auto& b : a) {
  13. for (const auto& p : b) {
  14. std::cout <<'('<< p.first << ' ' << p.second << ')';
  15. }
  16. std::cout <<'\n';
  17. }
  18. }
  19.  
  20. class RMQ{
  21. public:
  22. RMQ(int n) {
  23. this->n = n;
  24. a = std::vector<int> (n + 1);
  25. print(a);
  26. log = std::vector<int> (n + 1);
  27. print(log);
  28. height = fill_log(n + 1);
  29. print(log);
  30. s.resize(n + 1);
  31. std::cout << "nkn";
  32. print(s);
  33. for (int i = 1; i <= n; ++i) {
  34. s[i].resize(height + 1);
  35. }
  36. print(s);
  37. std::cout << "FLI\n";
  38. }
  39.  
  40. int fill_log(int n){
  41. std::cout << "FLI\n";
  42. log[0] = -1;
  43. for (int i = 1; i < n + 1; ++i){
  44. log[i] = log[i / 2] + 1;
  45. }
  46. std::cout << "FLO\n";
  47. return log[n];
  48. }
  49.  
  50. void add_element(int index, int element) {
  51. a[index] = element;
  52. }
  53.  
  54. std::pair<int, int> get_min_pair(std::pair<int, int>& lhs, std::pair<int, int>& rhs) {
  55. if (a[lhs.second] <= a[rhs.first] ) {
  56. return lhs;
  57. }
  58. if (a[lhs.first] >= a[rhs.second] ) {
  59. return rhs;
  60. }
  61. if (a[lhs.first] <= a[rhs.first]) {
  62. if (lhs.first != rhs.first) {
  63. return {lhs.first, rhs.first};
  64. }
  65. if (a[lhs.second] <= a[rhs.second]) {
  66. return lhs;
  67. }
  68. return rhs;
  69. }
  70. return {rhs.first, lhs.first};
  71. }
  72.  
  73.  
  74. void fill_s() {
  75. for(int i = 1; i < n; ++i) {
  76. if (a[i] < a[i + 1]) {
  77. s[i][1] = {i, i + 1};
  78. } else {
  79. s[i][1] = {i + 1, i};
  80. }
  81. }
  82.  
  83. for (int j = 2; (1 << j) < n + 1; ++j){
  84. for (int i = 1; i + (1 << j) - 1 < n + 1; ++i){
  85. s[i][j] = get_min_pair(s[i][j - 1], s[i + (1 << (j - 1))][j - 1]);
  86. }
  87. }
  88. }
  89.  
  90. int query(int u, int v) {
  91. if (u > v){
  92. std::swap(u, v);
  93. }
  94. int k = log[v - u + 1];
  95. return a[get_min_pair(s[u][k], s[v - (1 << k) + 1][k]).second];
  96. }
  97.  
  98. private:
  99. std::vector<int> log;
  100. std::vector<std::vector<std::pair<int, int>>> s;
  101. std::vector<int> a;
  102. int n = 0;
  103. int height = 0;
  104. };
  105.  
  106. int main() {
  107. int n = 0;
  108. int m = 0;
  109. int u = 0;
  110. int v = 0;
  111. int element = 0;
  112. std::cin >> n >> m;
  113. RMQ g(n);
  114. std::cout << "FLI\n";
  115.  
  116. for (int i = 1; i < n + 1; ++i){
  117. std::cin>>element;
  118. g.add_element(i, element);
  119. }
  120. g.fill_s();
  121. for (int i = 1; i < m + 1; ++i){
  122. std::cin >> u >> v;
  123. std::cout<<g.query(u, v);
  124. }
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement