Em đang học segment tree thì lúc đến phần khởi tạo size là power của 2, khi em dùng size = 2*size
như bên dưới nộp bài thì bị runtime error. còn Gán luôn sums.assign(2*size, 0)` thì lại accept ạ. Mọi người giải thích giúp em được không ạ, em cảm ơn.
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct segTree {
int size;
vector <int> sums;
inline int getMid (int x, int y) {
return (x+y)/2;
}
void init(int n) {
size = pow(2,ceil(log2(n)));
sums.assign(2*size, 0LL);
}
void set (int i, int v, int id, int lx, int rx) {
if (rx - lx == 1) {
sums[id] = v;
return;
}
int mid = getMid(lx,rx);
if (i < mid) {
set(i,v,id*2 + 1,lx,mid);
} else {
set(i,v,id*2 + 2,mid,rx);
}
sums[id] = sums[id*2+ 1] + sums[id*2+2];
}
void set (int i, int v) {
set (i,v,0,0,size);
}
int sum (int l, int r, int id, int lx, int rx) {
if (l >= rx or r <= lx) {
return 0;
}
if (lx >= l && rx <= r) {
return sums[id];
}
int mid = getMid(lx,rx);
return sum(l,r,id*2 + 1,lx,mid) + sum(l,r,id*2 + 2,mid,rx);
}
int sum (int l, int r) {
return sum (l,r,0,0,size);
}
};
signed main () {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
segTree st;
st.init(n);
for (int i = 0;i < n;i++) {
int x;
cin >> x;
st.set(i,x);
}
while(m--) {
int op;
cin >> op;
if (op == 1) {
int i,v;
cin >> i >> v;
st.set(i,v);
}
else {
int l, r;
cin >> l >> r;
cout << st.sum(l,r) << '\n';
}
}
return 0;
}