Josif_tepe

Untitled

Mar 22nd, 2026
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. typedef long long ll;
  7. const int maxn = 1e6 + 5;
  8. const int INF = 2e9;
  9. pair<int, int> segment_tree[3 * maxn];
  10. int a[maxn];
  11. int n;
  12.  
  13. pair<int, int> merge_nodes(pair<int, int> A, pair<int, int> B) {
  14.     vector<int> v = {A.first, A.second, B.first, B.second};
  15.     sort(v.begin(), v.end());
  16.    
  17.     return {v[2], v[3]};
  18. }
  19. void build_tree(int L, int R, int node) {
  20.     if(L == R) {
  21.         segment_tree[node] = {a[L], -INF};
  22.     }
  23.     else {
  24.         int middle = (L + R) / 2;
  25.         build_tree(L, middle, 2 * node);
  26.         build_tree(middle + 1, R, 2 * node + 1);
  27.         segment_tree[node] = merge_nodes(segment_tree[2 * node], segment_tree[2 * node + 1]);
  28.     }
  29. }
  30.  
  31. // L R i L R j L R
  32. pair<int, int> query(int i, int j, int L = 0, int R = n - 1, int node = 1) {
  33.     if(i <= L and R <= j) {
  34.         return segment_tree[node];
  35.     }
  36.     if(R < i or j < L) {
  37.         return {-INF, -INF};
  38.     }
  39.     int middle = (L + R) / 2;
  40.     return merge_nodes(query(i, j, L, middle, 2 * node), query(i, j, middle + 1, R, 2 * node + 1));
  41. }
  42.  
  43. void update(int idx, int new_value, int L = 0, int R = n - 1, int node = 1) {
  44.     if(L == R) {
  45.         segment_tree[node] = {new_value, -INF};
  46.     }
  47.     else {
  48.         int middle = (L + R) / 2;
  49.         if(idx <= middle) {
  50.             update(idx, new_value, L, middle, 2 * node);
  51.         }
  52.         else {
  53.             update(idx, new_value, middle + 1, R, 2 * node + 1);
  54.         }
  55.        
  56.         segment_tree[node] = merge_nodes(segment_tree[2 * node], segment_tree[2 * node + 1]);
  57.     }
  58. }
  59. int main()
  60. {
  61.     ios_base::sync_with_stdio(false);
  62.    
  63.     cin >> n;
  64.    
  65.     for(int i = 0; i < n; i++) {
  66.         cin >> a[i];
  67.     }
  68.    
  69.     build_tree(0, n - 1, 1);
  70.     int k;
  71.     cin >> k;
  72.     for(int i = 0; i < k; i++) {
  73.         char t;
  74.         cin >> t;
  75.         if(t == 'U') {
  76.             int idx, value;
  77.             cin >> idx >> value;
  78.             update(idx - 1, value);
  79.         }
  80.         else {
  81.             int x, y;
  82.             cin >> x >> y;
  83.             pair<int, int> res = query(x - 1, y - 1);
  84.             cout << res.first + res.second << "\n";
  85.         }
  86.     }
  87.     return 0;
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment