Advertisement
DuongNhi99

NKLINEUP (Segment Tree)

Mar 10th, 2022
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | None | 0 0
  1. //Tìm GTLN, GTNN trong từng đoạn [u, v]
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int INF = 1e9 + 7;
  6. const int N = 1e5 + 5;
  7.  
  8. int n, p, a[N];
  9. long long stMax[4 * N], stMin[4 * N];
  10.  
  11. void buildMax(int id, int l, int r) {
  12.     if (l == r) stMax[id] = a[l];
  13.     else {
  14.         int mid = (l + r) / 2;
  15.         buildMax(id*2, l, mid);
  16.         buildMax(id*2 + 1, mid + 1, r);
  17.        
  18.         stMax[id] = max(stMax[id*2], stMax[id*2 + 1]);
  19.     }
  20. }
  21.  
  22. void buildMin(int id, int l, int r) {
  23.     if (l == r) stMin[id] = a[l];
  24.     else {
  25.         int mid = (l + r) / 2;
  26.         buildMin(id*2, l, mid);
  27.         buildMin(id*2 + 1, mid + 1, r);
  28.        
  29.         stMin[id] = min(stMin[id*2], stMin[id*2 + 1]);
  30.     }
  31. }
  32.  
  33. int getMax(int u, int v, int id, int l, int r) {
  34.     if (v < l || r < u) return -INF;
  35.     if (u <= l && r <= v) return stMax[id];
  36.    
  37.     int mid = (l + r) / 2;
  38.     return max(getMax(u, v, id*2, l, mid), getMax(u, v, id*2 + 1, mid + 1, r));
  39. }
  40.  
  41. int getMin(int u, int v, int id, int l, int r) {
  42.     if (v < l || r < u) return INF;
  43.     if (u <= l && r <= v) return stMin[id];
  44.    
  45.     int mid = (l + r) / 2;
  46.     return min(getMin(u, v, id*2, l, mid), getMin(u, v, id*2 + 1, mid + 1, r));
  47. }
  48.  
  49. int main()
  50. {
  51.     ios_base::sync_with_stdio(false);
  52.     cin.tie(NULL); cout.tie(NULL);
  53.  
  54.     cin >> n >> p;
  55.    
  56.     for (int i = 1; i <= n; ++i)
  57.         cin >> a[i];
  58.        
  59.     buildMax(1, 1, n);
  60.     buildMin(1, 1, n);
  61.    
  62.     while (p--){
  63.        int u, v; cin >> u >> v;
  64.        cout << getMax(u, v, 1, 1, n) - getMin(u, v, 1, 1, n) << '\n';
  65.     }
  66.    
  67.     return 0;
  68. }
  69.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement