Josif_tepe

Untitled

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