Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. #include "pch.h"
  2. #include <stdio.h>
  3. #include <cmath>
  4. #include <iostream>
  5. using namespace std;
  6. int *nums, **max, n, deep;
  7.  
  8. int maxim(int pleft, int pright)
  9. {
  10. if (pleft == pright) return nums[pleft];
  11. if (pleft % 2 != 0) return fmax(nums[pleft], maxim(pleft + 1, pright));
  12. if (pright % 2 == 0) return fmax(nums[pright], maxim(pleft, pright - 1));
  13.  
  14. for (int i = deep; i > 0; i--)
  15. {
  16. int k = pow(2, i);
  17. if ((pleft % k == 0) && (pright - pleft >= k - 1)) return fmax(max[i - 1][pleft / k], maxim(pleft + k, pright));
  18. if (((pright + 1) % k == 0) && (pright - pleft >= k - 1)) return fmax(max[i - 1][(pright + 1) / k - 1], maxim(pleft, pright - k));
  19. }
  20. }
  21.  
  22. int main()
  23. {
  24. scanf_s("%d", &n);
  25. deep = ceil(log2l(n));
  26. nums = new int[n];
  27. max = new int*[deep];
  28. for (int i = 0; i < n; i++)
  29. {
  30. scanf_s("%d", &nums[i]);
  31. }
  32.  
  33. int width = n;
  34. for (int i = 0; i < deep; i++)
  35. {
  36. max[i] = new int[(int)(ceil((double)n / 2))];
  37.  
  38. if (i == 0)
  39. {
  40. for (int j = 0; j < n; j += 2)
  41. {
  42. max[0][(int)(j / 2)] = j + 1 < n ? (int)(fmax(nums[j], nums[j + 1])) : nums[j];
  43. }
  44. }
  45. else
  46. {
  47. for (int j = 0; j < width; j += 2)
  48. {
  49. max[i][(int)(j / 2)] = j + 1 < n ? (int)(fmax(max[i - 1][j], max[i - 1][j + 1])) : max[i - 1][j];
  50. }
  51. }
  52.  
  53. width = ceil((double)width / 2);
  54. }
  55.  
  56. int m, templ, tempr;
  57. scanf_s("%d", &m);
  58. for (int i = 0; i < m; i++)
  59. {
  60. scanf_s("%d%d", &templ, &tempr);
  61. printf_s("%d ", maxim(templ - 1, tempr - 1));
  62. }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement