Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #define MAXN 1000000
  3.  
  4.  
  5. struct Node {
  6. Node();
  7. int val;
  8. int lazy;
  9. bool neutralize;
  10. };
  11.  
  12.  
  13.  
  14. void Update(int nod, int st, int dr);
  15. int Query(int nod, int st, int dr);
  16. void Propagate(int nod);
  17.  
  18.  
  19.  
  20. int updatest, updatedr, updateval;
  21. int queryst, querydr;
  22.  
  23. bool updatemode = 0;
  24.  
  25.  
  26. Node arbint[4 * MAXN + 1];
  27.  
  28. int main() {
  29.  
  30.  
  31. freopen("flag.txt", "r", stdin);
  32.  
  33. int n, k;
  34.  
  35.  
  36. scanf("%d%d", &n, &k);
  37.  
  38.  
  39. for(int i = 0; i < k; i++) {
  40. int x;
  41. scanf("%d", &x);
  42. //x++;
  43.  
  44.  
  45. updatest = x;
  46. updatedr = x;
  47.  
  48. updateval = 1;
  49.  
  50. Update(1, 1, n);
  51. }
  52.  
  53.  
  54.  
  55. int q;
  56.  
  57. scanf("%d", &q);
  58.  
  59.  
  60. for(int i = 0; i < q; i++) {
  61. int x, r;
  62.  
  63.  
  64. scanf("%d%d", &r, &x);
  65. //x++;
  66. //y++;
  67.  
  68. queryst = x - r;
  69. querydr = x + r;
  70.  
  71.  
  72. int ans = Query(1, 1, n);
  73.  
  74. printf("%d\n", ans);
  75.  
  76. updatemode = 1;
  77.  
  78. updatest = x - r;
  79. updatedr = x + r;
  80.  
  81. updateval = -ans;
  82.  
  83.  
  84. Update(1, 1, n);
  85.  
  86.  
  87.  
  88. }
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95. return 0;
  96. }
  97.  
  98.  
  99. void Update(int nod, int st, int dr) {
  100.  
  101. Propagate(nod);
  102.  
  103. if(updatest <= st && dr <= updatedr) {
  104.  
  105. if(updatemode == 0) {
  106. arbint[nod].lazy += updateval;
  107. } else {
  108. arbint[nod].neutralize = 1;
  109. }
  110.  
  111. Propagate(nod);
  112. } else {
  113. int mij = (st + dr) / 2;
  114.  
  115. if(updatest <= mij) {
  116. Update(2 * nod, st, mij);
  117. }
  118.  
  119. if(updatedr > mij) {
  120. Update(2 * nod + 1, mij + 1, dr);
  121. }
  122.  
  123. Propagate(2 * nod);
  124. Propagate(2 * nod + 1);
  125.  
  126. arbint[nod].val = arbint[2 * nod].val + arbint[2 * nod + 1].val;
  127. }
  128.  
  129. }
  130.  
  131.  
  132. int Query(int nod, int st, int dr) {
  133.  
  134.  
  135. Propagate(nod);
  136.  
  137. if(queryst <= st && dr <= querydr) {
  138. Propagate(nod);
  139. return arbint[nod].val;
  140. } else {
  141. int mij = (st + dr) / 2;
  142.  
  143. int ret = 0;
  144.  
  145. if(queryst <= mij) {
  146. ret += Query(2 * nod, st, mij);
  147. }
  148.  
  149. if(querydr > mij) {
  150. ret += Query(2 * nod + 1, mij + 1, dr);
  151. }
  152.  
  153.  
  154. return ret;
  155. }
  156. }
  157.  
  158. Node::Node() {
  159. val = 0;
  160. lazy = 0;
  161. }
  162.  
  163.  
  164. void Propagate(int nod) {
  165. if(arbint[nod].lazy > 0) {
  166. arbint[nod].val += arbint[nod].lazy;
  167. arbint[2 * nod].lazy += arbint[nod].lazy;
  168. arbint[2 * nod + 1].lazy += arbint[nod].lazy;
  169. arbint[nod].lazy = 0;
  170. }
  171.  
  172. if(arbint[nod].neutralize) {
  173. arbint[nod].val = 0;
  174. arbint[2 * nod].neutralize = 1;
  175. arbint[2 * nod + 1].neutralize = 1;
  176. arbint[nod].neutralize = 0;
  177. }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement