CCCPaste

Untitled

#include 
using namespace std;

struct node {
    int value, lb, rb;
    node *L, *R;
    node(int _lb, int _rb) { // constructor (konsturktor so parametri)
        lb = _lb;
        rb = _rb;
        
        if(lb == rb) {
            value = 0;
        }
        else {
            int mid = (lb + rb) / 2;
            L = new node(lb, mid);
            R = new node(mid + 1, rb);
            value = L->value + R->value;
        }
    }
    int query(int i, int j) {
        if(i <= lb and rb <= j) {
            return value;
        }
        // i j l r i j
        if(j < lb or rb < i) {
            return 0;
        }
        return L->query(i, j) + R->query(i, j);
    }
    void update(int idx, int new_value) {
        if(lb == rb) {
            value = new_value;
            return;
        }
        if(idx >= R->lb) {
            R->update(idx, new_value);
        }
        else {
            L->update(idx, new_value);
        }
        value = L->value + R->value;
    }
};
int main() {
    int n;
    cin >> n;
    
    node * segment_tree = new node(0, n - 1);
    
    cout << segment_tree->query(0, n - 1) << endl;
    segment_tree->update(0, 1);
    segment_tree->update(1, 2);
    segment_tree->update(3, 3);
    
    for(int i = 0; i < n; i++) {
        cout << segment_tree->query(i, i) << " " ;
    }
    return 0;
}
/*
 5
 1 2 3 4 5
 5
 **/