Advertisement
raman92

Untitled

Mar 23rd, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <fstream>
  5. #include <map>
  6. #include <algorithm>
  7. #include <bitset>
  8. #include <set>
  9. #include <vector>
  10. #include <utility>
  11. #include <cstring>
  12. #include <string>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <climits>
  16. using namespace std;
  17. typedef vector<int> vi;
  18. typedef vector< vi > vvi;
  19. typedef pair<int,int> pi;
  20. typedef vector< pi > vpi;
  21. typedef vector< vpi > vvpi;
  22. #define rep(i,a,b) for(i = a;i<=b;i++)
  23. #define all(c) (c).begin(),(c).end()
  24. #define present(c,x) (c).find(x)!=(c).end()
  25. #define gpresent(c,x) find(all(c),x)
  26. #define tr(c,it) for( typeof( (c).begin()) it = (c).begin();it!=(c).end();it++ )
  27. #define accu(c) accumulate(all(c),0)
  28. #define scalar(c1,c2) inner_product(all(c1),(c2).begin(),0)
  29. #define maxel(c) max_element(all(c))
  30. #define minel(c) min_element(all(c))
  31. #define fx first
  32. #define sx second
  33. #define pb(a) push_back(a)
  34. #define mp(a,b) make_pair(a,b)
  35. #define inf -300010
  36. #define l(n) 2*n
  37. #define r(n) 2*n+1
  38. ifstream in("input.in",ios::in);
  39. ofstream out("output.out",ios::out);
  40.  
  41. //////////////////////////////////////CODE START HERE//////////////////////////////////////////////
  42. ////////////*****************************************************************/////////////////////
  43.  
  44. long long memo[10000000];
  45. long long lazy[10000000];
  46.  
  47. //l(nd) and r(nd) are #defined.
  48.  
  49. void update(int nd,int s,int e,int p,int q,int v){
  50.  
  51. if(e<p||s>q||s>e)
  52. return;
  53.  
  54. if(lazy[nd]!=0){
  55. memo[nd]+=(e-s+1)*lazy[nd];
  56. if(s!=e){
  57. lazy[l(nd)]+=lazy[nd]; //l(nd) is 2*nd
  58. lazy[r(nd)]+=lazy[nd]; //r(nd) is 2*nd+1
  59. }
  60. lazy[nd] = 0;
  61. }
  62.  
  63. if(s>=p&&e<=q){
  64. memo[nd]+=(e-s+1)*v;
  65. if(s!=e){
  66. lazy[l(nd)]+=v;
  67. lazy[r(nd)]+=v;
  68. }
  69. return;
  70. }
  71.  
  72. update(l(nd),s,(s+e)/2,p,q,v);
  73. update(r(nd),(s+e)/2+1,e,p,q,v);
  74.  
  75. memo[nd] = memo[l(nd)] + memo[r(nd)];
  76.  
  77. int m=(s+e)/2;
  78.  
  79. //these lines have been added.
  80. if(lazy[l(nd)]!=0)
  81. memo[nd]+=(m-s+1)*lazy[l(nd)];
  82.  
  83. if(lazy[r(nd)]!=0)
  84. memo[nd]+=(e-m)*lazy[r(nd)];
  85.  
  86. return;
  87. }
  88.  
  89. long long query(int nd,int s,int e,int p,int q){
  90.  
  91. if(lazy[nd]!=0){
  92. memo[nd]+=(e-s+1)*lazy[nd];
  93. if(s!=e){
  94. lazy[l(nd)]+=lazy[nd];
  95. lazy[r(nd)]+=lazy[nd];
  96. }
  97. lazy[nd] = 0;
  98. }
  99.  
  100. if(e<p||s>q||e<s)
  101. return -1;
  102.  
  103. if(s>=p&&e<=q){
  104. return memo[nd];
  105. }
  106.  
  107. long long p1 = query(l(nd),s,(s+e)/2,p,q);
  108. long long p2 = query(r(nd),(s+e)/2+1,e,p,q);
  109. long long sum = 0;
  110.  
  111. if(p1>0)
  112. sum+=p1;
  113. if(p2>0)
  114. sum+=p2;
  115.  
  116. return sum;
  117. }
  118.  
  119. int main(){
  120. int t,n,c,p,q,v,i,cs;
  121. scanf("%d",&t);
  122. while(t--){
  123. memset(memo,0,sizeof(memo));
  124. memset(lazy,0,sizeof(lazy));
  125. scanf("%d %d",&n,&c);
  126. rep(i,1,c){
  127. scanf("%d %d %d",&cs,&p,&q);
  128. if(cs)
  129. //printf("%lld\n",query(1,1,n,p,q));
  130. cout<<query(1,1,n,p,q)<<"\n";
  131. else{
  132. scanf("%d",&v);
  133. update(1,1,n,p,q,v);
  134. }
  135. }
  136. }
  137. return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement