Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define ll long long
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define M 100007
- #define INF 1e9
- #define INFL 1e18
- #define PI acos(-1)
- #define mp make_pair
- #define fast_in_out ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- //const int fx[]= {+1,-1,+0,+0};
- //const int fy[]= {+0,+0,+1,-1};
- //const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1}; // Kings Move
- //const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1}; // Kings Move
- //const int fx[]={-2, -2, -1, -1, 1, 1, 2, 2}; // Knights Move
- //const int fy[]={-1, 1, -2, 2, -2, 2, -1, 1}; // Knights Move
- int segment[100100];
- int input[100100];
- int lazy[100100];
- int blocksize;
- int preprocess(int n)
- {
- int current_segment=-1;
- int segment_size=sqrt(n);
- for(int i=0;i<n;i++)
- {
- if(i%segment_size==0)
- {
- current_segment++;
- }
- segment[current_segment]+=input[i];
- }
- return segment_size;
- }
- int getid(int index)
- {
- return index/blocksize;
- }
- int query(int segment_size,int l,int r)
- {
- int sum=0;
- int id1=getid(l);
- int id2=getid(r);
- while(l<r && l%segment_size!=0)
- {
- sum+=(input[l]+lazy[id1]);
- l++;
- }
- //loop until we reach
- //segment that contains r
- while(l+segment_size<=r)
- {
- // cout<<"second"<<endl;
- sum+=segment[l/segment_size];
- sum+=(lazy[l]*segment_size);
- l+=segment_size;
- }
- z=l%segment_size;
- x=l-z;
- while(l<=r)
- {
- // cout<<"third"<<endl;
- sum+=input[l]+lazy[x];
- l++;
- }
- return sum;
- }
- void update(int segment_size,int l,int r,int val)
- {
- // cout<<segment_size<<" "<<l<<" "<<r<<" "<<val<<endl;
- while(l<r && l%segment_size!=0)
- {
- // cout<<"first"<<endl;
- // cout<<input[l]<<" "<<val<<endl;
- input[l]+=val;
- l++;
- }
- while(l+segment_size<=r)
- {
- // cout<<"Second"<<endl;
- lazy[l]+=val;
- l+=segment_size;
- }
- while(l<=r)
- {
- // cout<<"third"<<endl;
- // cout<<l<<" "<<input[l]<<endl;
- input[l]+=val;
- l++;
- }
- }
- int main()
- {
- int t,kase=0;
- scanf("%d",&t);
- while(kase<t)
- {
- int n,q;
- scanf("%d %d",&n,&q);
- int sz=preprocess(n);
- blocksize=sz;
- int flag=1;
- int type;
- while(q--)
- {
- scanf("%d",&type);
- if(type==0)
- {
- int l,r,v;
- scanf("%d %d %d",&l,&r,&v);
- update(sz,l,r,v);
- for(int i=0;i<n;i++)
- {
- cout<<i<<" "<<input[i]<<" "<<lazy[i]<<endl;
- }
- }
- else
- {
- int l,r;
- scanf("%d %d",&l,&r);
- int ans=query(sz,l,r);
- if(flag)
- {
- printf("Case %d:\n",kase+1);
- flag=0;
- }
- printf("%d\n",ans);
- }
- // for(int i=0;i<n;i++)
- // {
- // cout<<input[i]<<" "<<lazy[i]<<endl;
- // }
- }
- for(int i=0;i<n;i++)
- {
- segment[i]=0;
- input[i]=0;
- }
- kase++;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement