Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define ll long long
- #define pi acos(-1.0)
- #define pb push_back
- #define vi vector<int>
- #define mapii map<int , int>
- #define mapci map<char, int>
- #define mapsi map<string,int>
- #define FOR(i,n) for(int i = 0;i<n;i++)
- #define CP(n) printf("Case %d: \n",n);
- using namespace std;
- ll tree[3000005],prop[3000005];
- void update(int node,int l,int r,int a,int b,int x)
- {
- if(l>b || r<a)
- return;
- if(l>=a && r<=b)
- {
- tree[node] += ((r - l) + 1)*x;
- prop[node]+=x;
- return;
- }
- int mid = (l+r)/2;
- int left = node * 2;
- int right = left +1;
- update(left,l,mid,a,b,x);
- update(right,mid+1,r,a,b,x);
- tree[node] = tree[left]+tree[right]+((r - l)+1)*prop[node];
- }
- ll query(int node,int l,int r,int a,int b,int c = 0)
- {
- if(l>b || r<a)
- return 0;
- if(l>=a && r<=b)
- return tree[node]+((r - l)+ 1 )*c;
- int mid = (l+r)/2;
- int left = node * 2;
- int right = left + 1;
- ll x = query(left,l,mid,a,b,c+prop[node]);
- ll y = query(right,mid+1,r,a,b,c+prop[node]);
- return x + y;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- int t;
- cin>>t;
- while(t--)
- {
- int n,c;
- memset(tree,0,sizeof tree);
- memset(prop,0,sizeof prop);
- cin>>n>>c;
- while(c--)
- {
- int choice,a,b,u;
- cin>>choice;
- if(choice)
- {
- // cout<<"dhukse 1"<<endl;
- cin>>a>>b;
- cout<<query(1,1,n,a,b)<<endl;
- }
- else
- {
- // cout<<"dhukse 2"<<endl;
- cin>>a>>b>>u;
- update(1,1,n,a,b,u);
- // cout<<"bair hois"<<endl;
- }
- //cout<<"dhukse"<<endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement