Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ll arr[M];
- struct data
- {
- ll sum,prop;
- }tree[4*M];
- void build(ll node,ll b,ll e)
- {
- if(b==e)
- {
- tree[node].sum=0;
- tree[node].prop=0;
- return;
- }
- ll mid=(b+e)/2;
- ll left=node*2;
- ll right=node*2+1;
- build(left,b,mid);
- build(right,mid+1,e);
- tree[node].sum=tree[left].sum+tree[right].sum;
- }
- void update(ll node,ll b,ll e,ll i,ll j,ll val)
- {
- if(i>e || j<b)
- return ;
- if(b>=i && e<=j)
- {
- tree[node].sum+=((e-b+1)*val);
- tree[node].prop+=val;
- return ;
- }
- ll left=node*2;
- ll right=node*2+1;
- ll mid=(b+e)/2;
- update(left,b,mid,i,j,val);
- update(right,mid+1,e,i,j,val);
- tree[node].sum=tree[left].sum+tree[right].sum+(e-b+1)*tree[node].prop;
- }
- ll query(ll node,ll b,ll e,ll i,ll j,ll carry)
- {
- if(i>e || j<b)
- {
- return 0;
- }
- if(b>=i && e<=j)
- {
- return tree[node].sum+carry*(e-b+1);
- }
- ll left=node*2;
- ll right=node*2+1;
- ll mid=(b+e)/2;
- ll p1=query(left,b,mid,i,j,carry+tree[node].prop);
- ll p2=query(right,mid+1,e,i,j,carry+tree[node].prop);
- return p1+p2;
- }
Advertisement
Add Comment
Please, Sign In to add comment