Guest User

Untitled

a guest
Jan 23rd, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <climits>
  4. using namespace std;
  5. long long int apples[100020],seg[200022],seg2[200022];
  6. long long int min (long long int a, long long int b){
  7. if(a<b) return a;
  8. return b;
  9. }
  10. void buildt(long long int start,long long int end,long long int node){
  11. if(start == end){
  12. seg[node] = apples[start];
  13. seg2[node] = apples[start];
  14. }
  15. else{
  16. long long int mid = (long long int) ((start + end) / 2);
  17. buildt( start, mid,(long long int)(2*node));
  18. buildt( (long long int)(mid+1), end,(long long int)((2*node)+1));
  19. seg[node] = seg[2*node] + seg[(2*node)+1];
  20. seg2[node] = min(seg2[2*node] , seg2[(2*node)+1]);
  21. }
  22. }
  23. void update(long long int node,long long int start,long long int end,long long int idx, long long int val)
  24. {
  25. if(start == end )
  26. {
  27. apples[idx] = (long long int) (apples[idx] + val);
  28. if(apples[idx] < 0){
  29. seg[node] = 0;
  30. seg2[node] = 0;
  31. }
  32. else{
  33. seg[node] = (long long int)(seg[node]+ val);
  34. seg2[node] = (long long int)(seg2[node] + val);
  35. }
  36. }
  37. else
  38. {
  39. long long int mid = (long long int) ((start + end) / 2);
  40. if(start <= idx && idx <= mid)
  41. update( (long long int)(2*node), start, mid, idx, val);
  42. else
  43. update((long long int)((2*node)+1), (long long int)(mid+1), end, idx, val);
  44. seg[node] = seg[2*node] + seg[(2*node)+1];
  45. seg2[node] = min(seg2[2*node] , seg2[(2*node)+1]);
  46. }
  47. }
  48. long long int querysum(long long int node, long long int start, long long int end,long long int l,long long int r)
  49. {
  50. if(r < start || end < l)
  51. {
  52. return 0;
  53. }
  54. if(l <= start && end <= r)
  55. return seg[node];
  56. long long int mid = (long long int) ((start + end) / 2);
  57. long long int p1 = querysum((long long int)(2*node), start, mid, l, r);
  58. long long int p2 = querysum((long long int)((2*node)+1), (long long int)(mid+1), end, l, r);
  59. return (p1 + p2);
  60. }
  61. long long int querymin(long long int node, long long int start, long long int end, long long int l, long long int r)
  62. {
  63. if(r < start || end < l)
  64. {
  65. return LLONG_MAX;
  66. }
  67. if(l <= start && end <= r)
  68. return seg2[node];
  69.  
  70. long long int mid = (long long int) ((start + end) / 2);
  71. long long int p1 = querymin((long long int)(2*node), start, mid, l, r);
  72. long long int p2 = querymin((long long int)((2*node)+1), (long long int)(mid+1), end, l, r);
  73. return min(p1 , p2);
  74. }
  75. int main()
  76. {
  77. long long int n;
  78. cin >> n;
  79. for(int i = 1; i <= n; i++)
  80. cin >> apples[i];
  81. buildt(1,n,1);
  82. int op;
  83. cin >> op;
  84. string c;
  85. getline(cin,c);
  86. while(op--){
  87. cin >> c;
  88. char a1[64];
  89. char a2[64];
  90. cin >> a1 >> a2;
  91. if(c[0] == 'C')
  92. cout << querysum(1,1,n,(long long int)(atoll(a1)+1),(long long int)(atoll(a2)+1)) - querymin(1,1,n,(long long int)(atoll(a1)+1),(long long int)(atoll(a2)+1))<<endl;
  93. else
  94. if(c[0] == 'G')
  95. update(1,1,n,(long long int)(atoll(a2)+1),(long long int)(atoll(a1)));
  96. else
  97. update(1,1,n,(long long int)(atoll(a2)+1),(long long int)(-1*(atoll(a1))));
  98.  
  99. }
  100. }
  101.  
  102. if(start == end )
  103. {
  104. apples[idx] = (long long int) (apples[idx] + val);
  105. if(apples[idx] < 0){
  106. seg[node] = 0;
  107. seg2[node] = 0;
  108. }
  109. else{
  110. seg[node] = (long long int)(seg[node]+ val);
  111. seg2[node] = (long long int)(seg2[node] + val);
  112. }
  113. }
  114.  
  115. if(start == end )
  116. {
  117. apples[idx] = (long long int) (apples[idx] + val);
  118. if(apples[idx] < 0){
  119. apples[idx]=0;
  120. seg[node] = 0;
  121. seg2[node] = 0;
  122. }
  123. else{
  124. seg[node] = (long long int)(seg[node]+ val);
  125. seg2[node] = (long long int)(seg2[node] + val);
  126. }
  127. }
  128.  
  129. #include <iostream>
  130. #include <string>
  131. #include <climits>
  132. using namespace std;
  133. long long int apples[100020],seg[200022],seg2[200022];
  134. long long int min (long long int a, long long int b){
  135. if(a<b) return a;
  136. return b;
  137. }
  138. void buildt(long long int start,long long int end,long long int node){
  139. if(start == end){
  140. seg[node] = apples[start];
  141. seg2[node] = apples[start];
  142. }
  143. else{
  144. long long int mid = (long long int) ((start + end) / 2);
  145. buildt( start, mid,(long long int)(2*node));
  146. buildt( (long long int)(mid+1), end,(long long int)((2*node)+1));
  147. seg[node] = seg[2*node] + seg[(2*node)+1];
  148. seg2[node] = min(seg2[2*node] , seg2[(2*node)+1]);
  149. }
  150. }
  151. void update(long long int node,long long int start,long long int end,long long int idx, long long int val)
  152. {
  153. if(start == end )
  154. {
  155. apples[idx] = (long long int) (apples[idx] + val);
  156. if(apples[idx] < 0){
  157. apples[idx]=0;
  158. seg[node] = 0;
  159. seg2[node] = 0;
  160. }
  161. else{
  162. seg[node] = (long long int)(seg[node]+ val);
  163. seg2[node] = (long long int)(seg2[node] + val);
  164. }
  165. }
  166. else
  167. {
  168. long long int mid = (long long int) ((start + end) / 2);
  169. if(start <= idx && idx <= mid)
  170. update( (long long int)(2*node), start, mid, idx, val);
  171. else
  172. update((long long int)((2*node)+1), (long long int)(mid+1), end, idx, val);
  173. seg[node] = seg[2*node] + seg[(2*node)+1];
  174. seg2[node] = min(seg2[2*node] , seg2[(2*node)+1]);
  175. }
  176. }
  177. long long int querysum(long long int node, long long int start, long long int end,long long int l,long long int r)
  178. {
  179. if(r < start || end < l)
  180. {
  181. return 0;
  182. }
  183. if(l <= start && end <= r)
  184. return seg[node];
  185. long long int mid = (long long int) ((start + end) / 2);
  186. long long int p1 = querysum((long long int)(2*node), start, mid, l, r);
  187. long long int p2 = querysum((long long int)((2*node)+1), (long long int)(mid+1), end, l, r);
  188. return (p1 + p2);
  189. }
  190. long long int querymin(long long int node, long long int start, long long int end, long long int l, long long int r)
  191. {
  192. if(r < start || end < l)
  193. {
  194. return LLONG_MAX;
  195. }
  196. if(l <= start && end <= r)
  197. return seg2[node];
  198.  
  199. long long int mid = (long long int) ((start + end) / 2);
  200. long long int p1 = querymin((long long int)(2*node), start, mid, l, r);
  201. long long int p2 = querymin((long long int)((2*node)+1), (long long int)(mid+1), end, l, r);
  202. return min(p1 , p2);
  203. }
  204. int main()
  205. {
  206. long long int n;
  207. cin >> n;
  208. for(int i = 1; i <= n; i++)
  209. cin >> apples[i];
  210. buildt(1,n,1);
  211. int op;
  212. cin >> op;
  213. string c;
  214. getline(cin,c);
  215. while(op--){
  216. cin >> c;
  217. long long a1,a2;
  218. cin >> a1 >> a2;
  219.  
  220. if(c[0] == 'C')
  221. cout << querysum(1,1,n,a1+1,a2+1) - querymin(1,1,n,a1+1,a2+1)<<endl;
  222. else
  223. if(c[0] == 'G')
  224. update(1,1,n,a2+1,a1);
  225. else
  226. update(1,1,n,a2+1,0-a1);
  227.  
  228. }
  229. }
Add Comment
Please, Sign In to add comment