1.2.3. This is the simple initialization and update part.
struct info
{
int prop,sum;
} tree[mx*3];
void update(int node,int b,int e,int i,int j,int x)
{
if (i > e || j < b) return;
if (b >= i && e <= j)
{
tree[node].sum+=((e-b+1)*x);
tree[node].prop+=x;
return;
}
int Left=node*2;
int Right=(node*2)+1;
int mid=(b+e)/2;
update(Left,b,mid,i,j,x);
update(Right,mid+1,e,i,j,x);
tree[node].sum=tree[Left].sum+tree[Right].sum+(e-b+1)*tree[node].prop;
}
4.This is the query part:
int query(int node,int b,int e,int i,int j,int carry=0)
{
if (i > e || j < b) return 0;
if(b>=i and e<=j) return tree[node].sum+carry*(e-b+1);
int Left=node<<1;
int Right=(node<<1)+1;
int mid=(b+e)>>1;
int p1 = query(Left, b,mid, i, j, carry+tree[node].prop);
int p2 = query(Right, mid+1, e, i, j,carry+tree[node].prop);
return p1+p2;
}
And from main
update(1,1,number_of_element,first_range,last_range,value);
query(1,1,n,first_range,last_range);
Here, tree is the segment tree. Every node will contain two
informations. One is with which number you added before. prop will
store that history. And sum is the total value of that node.
**After your comment:
//Initialization:
void init(int node,int b,int e)
{
if(b==e)
{
tree[node]=arr[b];
return;
}
int Left=node*2;
int Right=node*2+1;
int mid=(b+e)/2;
init(Left,b,mid);
init(Right,mid+1,e);
tree[node]=tree[Left]+tree[Right];
}
range
is: [lower, upper) or the set of integers between two bounds? – greybeard