Advertisement
Maruf_Hasan

SQRT Range Update(Partial Correct)

Feb 29th, 2020
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. #define pb push_back
  6. #define ll long long
  7. #define pii pair<int,int>
  8. #define pll pair<ll,ll>
  9. #define M 100007
  10. #define INF 1e9
  11. #define INFL 1e18
  12. #define PI acos(-1)
  13. #define mp make_pair
  14. #define fast_in_out ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  15. //const int fx[]= {+1,-1,+0,+0};
  16. //const int fy[]= {+0,+0,+1,-1};
  17. //const int fx[]={+0,+0,+1,-1,-1,+1,-1,+1}; // Kings Move
  18. //const int fy[]={-1,+1,+0,+0,+1,+1,-1,-1}; // Kings Move
  19. //const int fx[]={-2, -2, -1, -1, 1, 1, 2, 2}; // Knights Move
  20. //const int fy[]={-1, 1, -2, 2, -2, 2, -1, 1}; // Knights Move
  21.  
  22.  
  23. int segment[100100];
  24. int input[100100];
  25. int lazy[100100];
  26. int blocksize;
  27. int preprocess(int n)
  28. {
  29. int current_segment=-1;
  30. int segment_size=sqrt(n);
  31. for(int i=0;i<n;i++)
  32. {
  33. if(i%segment_size==0)
  34. {
  35. current_segment++;
  36. }
  37. segment[current_segment]+=input[i];
  38. }
  39.  
  40. return segment_size;
  41. }
  42. int getid(int index)
  43. {
  44. return index/blocksize;
  45. }
  46.  
  47. int query(int segment_size,int l,int r)
  48. {
  49.  
  50. int sum=0;
  51. int id1=getid(l);
  52. int id2=getid(r);
  53. while(l<r && l%segment_size!=0)
  54. {
  55. sum+=(input[l]+lazy[id1]);
  56. l++;
  57. }
  58. //loop until we reach
  59. //segment that contains r
  60.  
  61. while(l+segment_size<=r)
  62. {
  63. // cout<<"second"<<endl;
  64. sum+=segment[l/segment_size];
  65. sum+=(lazy[l]*segment_size);
  66. l+=segment_size;
  67. }
  68. z=l%segment_size;
  69. x=l-z;
  70. while(l<=r)
  71. {
  72. // cout<<"third"<<endl;
  73. sum+=input[l]+lazy[x];
  74. l++;
  75. }
  76.  
  77. return sum;
  78. }
  79.  
  80. void update(int segment_size,int l,int r,int val)
  81. {
  82. // cout<<segment_size<<" "<<l<<" "<<r<<" "<<val<<endl;
  83. while(l<r && l%segment_size!=0)
  84. {
  85. // cout<<"first"<<endl;
  86. // cout<<input[l]<<" "<<val<<endl;
  87. input[l]+=val;
  88. l++;
  89. }
  90. while(l+segment_size<=r)
  91. {
  92. // cout<<"Second"<<endl;
  93. lazy[l]+=val;
  94. l+=segment_size;
  95. }
  96. while(l<=r)
  97. {
  98. // cout<<"third"<<endl;
  99. // cout<<l<<" "<<input[l]<<endl;
  100. input[l]+=val;
  101. l++;
  102. }
  103. }
  104.  
  105. int main()
  106. {
  107. int t,kase=0;
  108. scanf("%d",&t);
  109. while(kase<t)
  110. {
  111.  
  112. int n,q;
  113. scanf("%d %d",&n,&q);
  114. int sz=preprocess(n);
  115. blocksize=sz;
  116. int flag=1;
  117. int type;
  118. while(q--)
  119. {
  120. scanf("%d",&type);
  121. if(type==0)
  122. {
  123. int l,r,v;
  124. scanf("%d %d %d",&l,&r,&v);
  125. update(sz,l,r,v);
  126. for(int i=0;i<n;i++)
  127. {
  128. cout<<i<<" "<<input[i]<<" "<<lazy[i]<<endl;
  129. }
  130. }
  131. else
  132. {
  133. int l,r;
  134. scanf("%d %d",&l,&r);
  135. int ans=query(sz,l,r);
  136. if(flag)
  137. {
  138. printf("Case %d:\n",kase+1);
  139. flag=0;
  140. }
  141. printf("%d\n",ans);
  142. }
  143. // for(int i=0;i<n;i++)
  144. // {
  145. // cout<<input[i]<<" "<<lazy[i]<<endl;
  146. // }
  147. }
  148.  
  149.  
  150.  
  151. for(int i=0;i<n;i++)
  152. {
  153. segment[i]=0;
  154. input[i]=0;
  155. }
  156.  
  157. kase++;
  158. }
  159. return 0;
  160.  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement