Josif_tepe

Untitled

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