Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 100007
- typedef long long ll;
- using namespace std;
- ll st[4*MAX], acum[4*MAX];
- void build(int id, int l, int r){
- if(l == r) st[id] = 0;
- else{
- int mid = (l + r)/2;
- build(2*id, l, mid);
- build(2*id+1, mid+1, r);
- st[id] = st[2*id] + st[2*id+1];
- }
- }
- void add(int id, int l, int r, int val){
- st[id] = val*(r-l+1);
- acum[id] += val;
- }
- void f5(int id, int l, int r, int x, int y, int val){
- if(l > y || r < x) return;
- else if(x <= l && r <= y) add(id, l, r, val);
- else{
- int mid = (l+r)/2;
- add(2*id, l, mid, acum[id]);
- add(2*id+1, mid+1, r, acum[id]);
- acum[id] = 0;
- f5(2*id, l, mid, x, y, val);
- f5(2*id+1, mid+1, r, x, y, val);
- st[id] = st[2*id] + st[2*id+1];
- }
- }
- ll query(int id, int l, int r, int x, int y){
- if(l > y || r < x) return 0;
- else if(x <= l && r <= y) return st[id];
- else{
- int mid = (l+r)/2;
- add(2*id, l, mid, acum[id]);
- add(2*id+1, mid+1, r, acum[id]);
- acum[id] = 0;
- return query(2*id, l, mid, x, y) + query(2*id+1, mid+1, r, x, y);
- }
- }
- int main(){
- int cases; scanf("%d", &cases);
- while(cases--){
- int n, c; scanf("%d %d", &n, &c);
- build(1, 0, n-1);
- while(c--){
- int tipo, l, r; scanf("%d %d %d", &tipo, &l, &r);
- if(!tipo){
- int val; scanf("%d", &val);
- f5(1, 0, n-1, l-1, r-1, val);
- }else printf("%lld\n", query(1, 0, n-1, l-1, r-1));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement