Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //SEGTREE COM LAZY PROPAGATION
- #include <cstdio>
- #include <cstring>
- long long segtree[400000], lazy[400000];
- void propagate(int root, int l, int r) {
- segtree[root] += lazy[root] * (r-l+1);
- if(l != r) {
- lazy[2*root+1] += lazy[root];
- lazy[2*root+2] += lazy[root];
- }
- lazy[root] = 0;
- }
- long long query(int root, int l, int r, int a, int b) {
- if(b < l || r < a) return 0;
- propagate(root, l, r);
- if(a <= l && r <= b) return segtree[root];
- int mid = (l+r)/2;
- return query(2*root+1, l, mid, a, b) + query(2*root+2, mid+1, r, a, b);
- }
- void update(int root, int l, int r, int a, int b, int val) {
- if(b < l || r < a) return;
- if(a <= l && r <= b) { lazy[root] += val; return; }
- int mid = (l+r)/2;
- update(2*root+1, l, mid, a, b, val);
- update(2*root+2, mid+1, r, a, b, val);
- propagate(2*root+1, l, mid);
- propagate(2*root+2, mid+1, r);
- segtree[root] = segtree[2*root+1] + segtree[2*root+2];
- }
- int main() {
- int t;
- scanf("%d", &t);
- while(t--) {
- int n, c;
- scanf("%d %d", &n, &c);
- memset(segtree, 0, sizeof segtree);
- memset(lazy, 0, sizeof lazy);
- for(int i = 0; i < c; i++) {
- int type;
- scanf("%d", &type);
- int p, q, v;
- if(type == 0) {
- scanf("%d %d %d", &p, &q, &v);
- update(0, 0, n-1, p-1, q-1, v);
- } else if(type == 1) {
- scanf("%d %d", &p, &q);
- printf("%lld\n", query(0, 0, n-1, p-1, q-1));
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement