Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long int ll;
- ll tree[2000005],lazy[2000005],arr[2000005]={0};
- void buildtree(ll node,ll start,ll finish)
- {
- if(start==finish)
- {
- tree[node]=arr[finish];
- return;
- }
- ll left=node*2;
- ll right=left+1;
- ll mid=(start+finish)/2;
- buildtree(left,start,mid);
- buildtree(right,mid+1,finish);
- tree[node]=tree[left]+tree[right];
- }
- void clearlazy(ll node,ll start,ll finish)
- {
- tree[node]+=((finish-start+1)*lazy[node]);
- if(start!=finish)
- {
- ll left=node*2;
- ll right=left+1;
- lazy[left]+=lazy[node];
- lazy[right]+=lazy[node];
- }
- lazy[node]=0;
- }
- void update(ll node,ll start,ll finish,ll ranges,ll rangef,ll value)
- {
- clearlazy(node,start,finish);
- if(ranges>finish || rangef<start)
- return;
- if(ranges<=start&&rangef>=finish)
- {
- lazy[node]=value;
- clearlazy(node,start,finish);
- return;
- }
- ll mid=(start+finish)/2;
- ll left=node*2;
- ll right=left+1;
- update(left,start,mid,ranges,rangef,value);
- update(right,mid+1,finish,ranges,rangef,value);
- tree[node]=tree[left]+tree[right];
- }
- ll query(ll node,ll start,ll finish,ll ranges,ll rangef)
- {
- clearlazy(node,start,finish);
- if(ranges>finish || rangef<start)
- return 0;
- if(ranges<=start&&rangef>=finish)
- {
- return tree[node];
- }
- ll mid=(start+finish)/2;
- ll left=node*2;
- ll right=left+1;
- ll ans1=query(left,start,mid,ranges,rangef);
- ll ans2=query(right,mid+1,finish,ranges,rangef);
- return ans1+ans2;
- }
- int main()
- {
- ll n,q,i,j,k,ranges,rangef,ans,value,t,cas,flag;
- scanf("%lld",&t);
- for(cas=1;cas<=t;cas++)
- {
- memset(arr,0,sizeof(arr));
- memset(tree,0,sizeof(tree));
- memset(lazy,0,sizeof(lazy));
- scanf("%lld %lld",&n,&q);
- buildtree(1,1,n);
- printf("Case %lld:\n",cas);
- while(q--)
- {
- scanf("%lld %lld %lld",&flag,&ranges,&rangef);
- if(flag==0)
- {
- scanf("%lld",&value);
- update(1,1,n,ranges+1,rangef+1,value);
- }
- else
- {
- ans=query(1,1,n,ranges+1,rangef+1);
- printf("%lld\n",ans);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement