---
# System prepended metadata

title: Lazy Propagation

---

# Lazy Propagation

## 1. Add Update
- [Addition to Segment](https://codeforces.com/edu/course/2/lesson/5/1/practice/contest/279634/problem/A)

## 2. Max Update
- [Applying MAX to Segment](https://codeforces.com/edu/course/2/lesson/5/1/practice/contest/279634/problem/B)

## 3. Assign Update
- [Assignment to Segment](https://codeforces.com/edu/course/2/lesson/5/1/practice/contest/279634/problem/C)

## 4. Range Query
- [Addition and Minimum](https://codeforces.com/edu/course/2/lesson/5/2/practice/contest/279653/problem/A)
- [Bitwise OR and AND](https://codeforces.com/edu/course/2/lesson/5/2/practice/contest/279653/problem/C)
- [Addition and Sum](https://codeforces.com/edu/course/2/lesson/5/2/practice/contest/279653/problem/D)

## 5. Maximum Segment
- [Assignment and Maximal Segment](https://codeforces.com/edu/course/2/lesson/5/3/practice/contest/280799/problem/A)

## 6. Inverse Update
- [Inverse and K-th one](https://codeforces.com/edu/course/2/lesson/5/3/practice/contest/280799/problem/B)

## 7. Classic Problems
- [Assignment, Addition, and Sum](https://codeforces.com/edu/course/2/lesson/5/4/practice/contest/280801/problem/A)
- [Problem About Weighted Sum](https://codeforces.com/edu/course/2/lesson/5/4/practice/contest/280801/problem/D)

## 8. Problems
- [Lucky Queries](https://codeforces.com/contest/145/problem/E)
- [A Simple Task](https://codeforces.com/contest/558/problem/E)
- [Alphabet Permutations](https://codeforces.com/contest/610/problem/E)

## Practice Problems
- [Circular RMQ](https://codeforces.com/contest/52/problem/C)
- [DZY Loves Fibonacci Numbers](https://codeforces.com/contest/446/problem/C)
- [The Child and Sequence](https://codeforces.com/contest/438/problem/D)
- [Linear Kingdom Races](https://codeforces.com/contest/115/problem/E)
- [TorCoder](https://codeforces.com/contest/240/problem/F)
- [Lucky Array](https://codeforces.com/blog/entry/2956)
- [Kefa and Watch](https://codeforces.com/contest/580/problem/E)

## Reference Code
```cpp=
#include <bits/stdc++.h>

#define mid (l+r)/2

using namespace std;

typedef long long ll;

const int N = 1e5+7;

struct node {
	ll sum;
	ll lazy;
	node() {sum=lazy=0;}
};

node seg[N*4];
int n,m,a[N];

void push(int l, int r, int id) {
	if (l != r) {
		seg[id*2].lazy += seg[id].lazy;
		seg[id*2+1].lazy += seg[id].lazy;
	}
	seg[id].sum += (r-l+1)*seg[id].lazy;
	seg[id].lazy = 0;
}

node merge(node left, node right) {
	node ret;
	ret.sum = left.sum+right.sum;
	return ret;
}

void build(int l = 0, int r = n-1, int id = 1) {
	if (l == r) {
        seg[id].sum = a[l];
        seg[id].lazy = 0;
    }
    
	build(l,mid,id*2);
	build(mid+1,r,id*2+1);
	
	seg[id] = merge(seg[id*2],seg[id*2+1]);
}

void update(int L, int R, int x, int l = 0, int r = n-1, int id = 1) {
	push(l,r,id);
	
	if (l > R || r < L) return;
	if (l >= L && r <= R) {
		seg[id].lazy += x;
		push(l,r,id);
		return;
	}
	
	update(L,R,x,l,mid,id*2);
	update(L,R,x,mid+1,r,id*2+1);
	
	seg[id] = merge(seg[id*2],seg[id*2+1]);
}

node query(int L, int R, int l = 0, int r = n-1, int id = 1) {
	push(l,r,id);
	
	if (l >= L && r <= R) return seg[id];
	if (l > R || r < L) {
		node ret;
		ret.sum = 0;
		return ret;
	}
	
	return merge(query(L,R,l,mid,id*2),query(L,R,mid+1,r,id*2+1));
}

int main() {
	scanf("%d %d",&n,&m);
	for(int i = 0 ; i < n ; i++) scanf("%d",a+i);
	build();
	for(int i = 0 ; i < m ; i++) {
		int t;
		scanf("%d",&t);
		if (t == 1) {
			int l,r,v;
			scanf("%d %d %d",&l,&r,&v);
			update(l,r,v);
		} else if (t == 2) {
			int l,r;
			scanf("%d %d",&l,&r);
			r--;
			printf("%lld\n",query(l,r).sum);
		}
	}
}
```