Josif_tepe

Untitled

Nov 20th, 2025
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn = 50005;
  6. const int INF = 2e9;
  7. struct node_data {
  8.     ll sum, prefix, suffix, res;
  9. };
  10.  
  11. int n, a[maxn];
  12. node_data merge_nodes(node_data A, node_data B) {
  13.     node_data C;
  14.    
  15.     C.sum = A.sum + B.sum;
  16.     C.prefix = max(A.prefix, A.sum + B.prefix);
  17.     C.suffix = max(B.suffix, B.sum + A.suffix);
  18.    
  19.     C.res = max(C.prefix, max(C.suffix, max(A.res, max(B.res, A.suffix + B.prefix))));
  20.    
  21.     return C;
  22. }
  23.  
  24. node_data make_node(int value) {
  25.     node_data C;
  26.     C.sum = value;
  27.     C.prefix = max(-INF, value);
  28.     C.suffix = max(-INF, value);
  29.     C.res = max(-INF, value);
  30.    
  31.     return C;
  32. }
  33.  
  34. node_data segment_tree[3 * maxn];
  35.  
  36. void build_tree(int L, int R, int node) {
  37.     if(L == R) {
  38.         segment_tree[node] = make_node(a[L]);
  39.     }
  40.     else {
  41.         int middle = (L + R) / 2;
  42.         build_tree(L, middle, 2 * node);
  43.         build_tree(middle + 1, R, 2 * node + 1);
  44.         segment_tree[node] = merge_nodes(segment_tree[2 * node], segment_tree[2 * node + 1]);
  45.     }
  46. }
  47.  
  48. //L R i L R j L r
  49. node_data query(int i, int j, int L, int R, int node) {
  50.     if(i <= L and R <= j) {
  51.         return segment_tree[node];
  52.     }
  53.     if(R < i or j < L) {
  54.         return make_node(-INF);
  55.     }
  56.    
  57.     int middle = (L + R) / 2;
  58.    
  59.     return merge_nodes(query(i, j, L, middle, 2 * node), query(i, j, middle + 1, R, 2 * node + 1));
  60. }
  61.  
  62. void update(int idx, int new_value, int L, int R, int node) {
  63.     if(L == R) {
  64.         segment_tree[node] = make_node(new_value);
  65.         return;
  66.     }
  67.    
  68.     int middle = (L + R) / 2;
  69.     if(idx <= middle) {
  70.         update(idx, new_value, L, middle, 2 * node);
  71.     }
  72.     else {
  73.         update(idx, new_value, middle + 1, R, 2 * node + 1);
  74.     }
  75.    
  76.     segment_tree[node] = merge_nodes(segment_tree[2 * node], segment_tree[2 * node + 1]);
  77. }
  78. int main() {
  79.     ios_base::sync_with_stdio(false);
  80.     cin >> n;
  81.    
  82.     for(int i = 0; i < n; i++) {
  83.         cin >> a[i];
  84.     }
  85.     build_tree(0, n - 1, 1);
  86.     int q;
  87.     cin >> q;
  88.    
  89.     for(int i = 0; i < q; i++) {
  90.         int type;
  91.         cin >> type;
  92.        
  93.         if(type == 0) {
  94.             int x, y;
  95.             cin >> x >> y;
  96.             update(x - 1, y, 0, n - 1, 1);
  97.         }
  98.         else {
  99.             int x, y;
  100.             cin >> x >> y;
  101.             cout << query(x - 1, y - 1, 0, n - 1, 1).res << endl;
  102.         }
  103.     }
  104.    
  105.    
  106.    
  107.     return 0;
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment