fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4.  
  5. ll int node[1000000];
  6. ll int lazy[1000000];
  7.  
  8. int update(int x,int y,int l,int r,int v,int i){
  9. if (lazy[i]!=0){
  10. node[i]+=((r-l+1)*lazy[i]);
  11. if (l!=r){
  12. lazy[2*i+1]+=lazy[i];
  13. lazy[2*i+2]+=lazy[i];
  14. }
  15. lazy[i]=0;
  16. }
  17. if (y<l||x>r||l>r) return 0;
  18. if (x<=l&&y>=r){
  19. node[i]+= ((r-l+1)*v);
  20. if (l!=r){
  21. lazy[2*i+1]+=v;
  22. lazy[2*i+2]+=v;
  23. }
  24. return 0;
  25. }
  26. int mid = (l+r)/2;
  27. update(x,y,l,mid,v,2*i+1);
  28. update(x,y,mid+1,r,v,2*i+2);
  29. node[i] = node[2*i+1]+node[2*i+2];
  30. return 0;
  31. }
  32.  
  33. ll int querytree(int x,int y,int l,int r,int i){
  34. if (l>r) return 0;
  35. if (y<l||x>r) return 0;
  36. if (lazy[i]!=0){
  37. node[i]+=((r-l+1)*lazy[i]);
  38. if (l!=r){
  39. lazy[2*i+1]+=lazy[i];
  40. lazy[2*i+2]+=lazy[i];
  41. }
  42. lazy[i]=0;
  43. }
  44. if (l>=x&&r<=y) return node[i];
  45. else{
  46. int mid = (l+r)/2;
  47. return (querytree(x,y,l,mid,2*i+1)+querytree(x,y,mid+1,r,2*i+2));
  48. }
  49. }
  50.  
  51. int main(){
  52. int t;
  53. scanf("%d",&t);
  54. while (t--){
  55. int n,query;
  56. scanf("%d%d",&n,&query);
  57. while (query--){
  58. int ch,p,q;
  59. scanf("%d%d%d",&ch,&p,&q);
  60. p--;
  61. q--;
  62. if (ch==0){
  63. int v;
  64. scanf("%d",&v);
  65. update(p,q,0,n-1,v,0);
  66. }
  67. else{
  68. printf("%lld\n",querytree(p,q,0,n-1,0));
  69. }
  70. }
  71. memset(node,0,sizeof(node));
  72. memset(lazy,0,sizeof(lazy));
  73. }
  74. return 0;
  75. }
  76.  
Runtime error #stdin #stdout 0s 19080KB
stdin
Standard input is empty
stdout
Standard output is empty