Advertisement
Vince14

/<> 2357 (bottom up seg tree)

Sep 9th, 2023
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <stack>
  10. #include <queue>
  11. #include <deque>
  12. #include <unordered_map>
  13. #include <numeric>
  14. #include <iomanip>
  15. using namespace std;
  16. #define pii pair<long long, long long>
  17. #define ll long long
  18. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
  19. const long long dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
  20. const long long dl[2] = {1, -1};
  21. const long long MOD = 1000000007;
  22. const long long MAXN = 100005;
  23.  
  24. int N, M;
  25. int arr[MAXN];
  26. int seg_min[MAXN * 4];
  27. int seg_max[MAXN * 4];
  28. int sz;
  29.  
  30. void find_sz(){
  31.     int x = 1;
  32.     while(x < N){
  33.         x *= 2;
  34.     }
  35.     sz = x;
  36. }
  37.  
  38. void build(){
  39.     for(int i = 0; i < N; i++){
  40.         seg_min[sz + i] = arr[i];
  41.         seg_max[sz + i] = arr[i];
  42.     }
  43.     for(int i = sz - 1; i >= 1; i--){
  44.         seg_min[i] = min(seg_min[i * 2], seg_min[i * 2 + 1]);
  45.         seg_max[i] = max(seg_max[i * 2], seg_max[i * 2 + 1]);
  46.     }
  47. }
  48.  
  49. int query_min(int l, int r){
  50.     l += sz;
  51.     r += sz;
  52.     int ret = 2e9;
  53.     while(l <= r){
  54.         if(l % 2 == 1){
  55.             ret = min(ret, seg_min[l]);
  56.             l++;
  57.         }
  58.         if(r % 2 == 0){
  59.             ret = min(ret, seg_min[r]);
  60.             r--;
  61.         }
  62.         l /= 2; r /= 2;
  63.     }
  64.     return ret;
  65. }
  66.  
  67. int query_max(int l, int r){
  68.     l += sz;
  69.     r += sz;
  70.     int ret = 0;
  71.     while(l <= r){
  72.         if(l % 2 == 1){
  73.             ret = max(ret, seg_max[l]);
  74.             l++;
  75.         }
  76.         if(r % 2 == 0){
  77.             ret = max(ret, seg_max[r]);
  78.             r--;
  79.         }
  80.         l /= 2; r /= 2;
  81.     }
  82.     return ret;
  83. }
  84.  
  85.  
  86. int main() {
  87.     FAST;
  88.     cin >> N >> M;
  89.     for(int i = 0; i < N; i++){
  90.         cin >> arr[i];
  91.     }
  92.     find_sz();
  93.     build();
  94.     for(int i = 0; i < M; i++){
  95.         int a, b;
  96.         cin >> a >> b;
  97.         a--;
  98.         b--;
  99.         if(a > b) swap(a, b);
  100.         cout << query_min(a, b) << " " << query_max(a, b) << "\n";
  101.     }
  102. }
  103.  
  104. /*
  105. 10 4
  106. 75
  107. 30
  108. 100
  109. 38
  110. 50
  111. 51
  112. 52
  113. 20
  114. 81
  115. 5
  116. 1 10
  117. 3 5
  118. 6 9
  119. 8 10
  120.  */
  121.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement