# segment tree ```cpp= #include<bits/stdc++.h> #define spdup ios::sync_with_stdio(0),cin.tie(0) #define ll long long using namespace std; vector<ll> a={1,3,5,7,9,11}; //origin value array vector<ll> segTree(100,-1); //segment tree array ll len=6; //array size void build(ll tl,ll tr,ll node){ // tl = array left , tr = array right , node = segTree index if(tl==tr){ //lastChild segTree[node]=a[tl]; // set => array [tl] or [tr] } else{ //parentNode ll mid=(tl+tr)/2; //binary ll nodeL=(2 * node + 1); //leftNode = 2*n+1 ll nodeR=(2 * node + 2); //rightNode= 2*n+2 build(tl,mid,nodeL); //build left tree build(mid+1,tr,nodeR); //build right tree segTree[node]=segTree[nodeL]+segTree[nodeR]; //parent = leftChild + rightChild } } void update(ll tl ,ll tr, ll node,ll index,ll val){ //update value if(tl==tr){ a[index]=val; segTree[node]=val; } else{ ll mid=(tl+tr)/2; ll nodeL=(2 * node + 1); ll nodeR=(2 * node + 2); if(index > mid){ update(mid+1,tr,nodeR,index,val); } else{ update(tl,mid,nodeL,index,val); } segTree[node]=segTree[nodeL]+segTree[nodeR]; } } ll query(ll tl ,ll tr, ll node,ll L,ll R){ //sum range cout<<tl<<'\n'<<tr<<'\n'<<'\n'; if(tl>R || tr<L){ return 0; } else if(tl==tr || (L <= tl && tr <= R)){ return segTree[node]; } ll mid=(tl+tr)/2; ll nodeL=(2 * node + 1); ll nodeR=(2 * node + 2); ll sumL=query(tl,mid,nodeL,L,R); ll sumR=query(mid+1,tr,nodeR,L,R); return sumL+sumR; } signed main(void){ spdup; build(0,len-1,0); //build segmenttree // for(ll x=0;x!=15;x++){ // cout<<x<<'='<<segTree[x]<<'\n'; // } // cout<<'\n'; update(0,len-1,0,4,6); //update array[4]=6 // for(ll x=0;x!=15;x++){ // cout<<x<<'='<<segTree[x]<<'\n'; // } // cout<<'\n'; cout<<query(0,len-1,0,2,5)<<'\n'; //query 2 ~ 5 } ```