Advertisement
Josif_tepe

Untitled

Feb 27th, 2023
608
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <map>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <stack>
  8. #include <queue>
  9.  
  10. using namespace std;
  11. const int maxn = 1e5 + 10;
  12. const int INF = 2e9;
  13. int arr[maxn];
  14. pair<int, int> segment_tree[3 * maxn];
  15.  
  16. void merge_nodes(pair<int, int> & tree_node, pair<int, int> & L, pair<int, int> & R) {
  17.     vector<int> v;
  18.     v.push_back(L.first);
  19.     v.push_back(L.second);
  20.     v.push_back(R.first);
  21.     v.push_back(R.second);
  22.    
  23.     sort(v.begin(), v.end());
  24.     tree_node = make_pair(v[2], v[3]);
  25. }
  26. pair<int, int> merge_query(pair<int, int> L, pair<int, int> R) {
  27.     vector<int> v;
  28.     v.push_back(L.first);
  29.     v.push_back(L.second);
  30.     v.push_back(R.first);
  31.     v.push_back(R.second);
  32.    
  33.     sort(v.begin(), v.end());
  34.    
  35.     return make_pair(v[2], v[3]);
  36. }
  37. void build_tree(int L, int R, int position) {
  38.     if(L == R) {
  39.         segment_tree[position] = make_pair(arr[L], -INF);
  40.     }
  41.     else {
  42.         int middle = (L + R) / 2;
  43.         build_tree(L, middle, 2 * position);
  44.         build_tree(middle + 1, R, 2 * position + 1);
  45.         merge_nodes(segment_tree[position], segment_tree[2 * position], segment_tree[2 * position + 1]);
  46.     }
  47. }
  48. // L R i L R j L R
  49. pair<int, int> query(int L, int R, int position, int i, int j) {
  50.     if(i <= L and R <= j) {
  51.         return segment_tree[position];
  52.     }
  53.     if(R < i or j < L) {
  54.         return make_pair(-INF, -INF);
  55.     }
  56.     int middle = (L + R) / 2;
  57.     return merge_query(query(L, middle, 2 * position, i, j), query(middle + 1, R, 2 * position + 1, i, j));
  58. }
  59. void update(int L, int R, int position, int idx, pair<int, int> new_value) {
  60.     if(L == R) {
  61.         segment_tree[position] = new_value;
  62.         return;
  63.     }
  64.     int middle = (L + R) / 2;
  65.     if(idx <= middle) {
  66.         update(L, middle, 2 * position, idx, new_value);
  67.     }
  68.     else {
  69.         update(middle + 1, R, 2 * position + 1, idx, new_value);
  70.     }
  71.     merge_nodes(segment_tree[position], segment_tree[2 * position], segment_tree[2 * position + 1]);
  72. }
  73. int main() {
  74.     ios_base::sync_with_stdio(false);
  75.     int n;
  76.     cin >> n;
  77.    
  78.     for(int i = 0; i < n; i++) {
  79.         cin >> arr[i];
  80.     }
  81.     build_tree(0, n - 1, 1);
  82.    
  83.     int q;
  84.     cin >> q;
  85.    
  86.     for(int i = 0; i < q; i++) {
  87.         char c;
  88.         cin >> c;
  89.        
  90.         if(c == 'U') {
  91.             int idx, new_value;
  92.             cin >> idx >> new_value;
  93.             idx--;
  94.             update(0, n - 1, 1, idx, make_pair(new_value, -INF));
  95.         }
  96.         else {
  97.             int a, b;
  98.             cin >> a >> b;
  99.             a--; b--;
  100.            
  101.             pair<int, int> p = query(0, n - 1, 1, a, b);
  102.            
  103.             cout << p.first + p.second << endl;
  104.         }
  105.     }
  106.    
  107.     return 0;
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement