Guest User

Untitled

a guest
Nov 17th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long llint;
  6. typedef pair <int, int> pii;
  7.  
  8. #define TRACE(x) cerr << #x << ' ' << x << endl
  9. #define FOR(i, a, b) for (int i = (a); i < (b); i++)
  10. #define REP(i, n) FOR(i, 0, n)
  11. #define _ << ' ' <<
  12.  
  13. #define X first
  14. #define Y second
  15.  
  16. const int MAXN = 100100;
  17. const int offset = (1 << 18);
  18.  
  19. struct node {
  20. int x, y, val, prop;
  21. int last_val;
  22. int set;
  23.  
  24. node(){
  25. last_val = 1;
  26. prop = set = 0;
  27. val = 0;
  28. }
  29. };
  30.  
  31. struct tournament {
  32. node p[offset * 2];
  33.  
  34. node merge(node a, node b, int last) {
  35. node ret;
  36. ret.last_val = last;
  37. if (!b.set) ret = a;
  38. if (!a.set) ret = b;
  39. if (!b.set || !a.set) ret.last_val = last;
  40. if (!b.set || !a.set) return ret;
  41. ret.set = 1;
  42. ret.x = min(a.x, b.x);
  43. ret.y = max(a.y, b.y);
  44. ret.val = last * (b.x - a.y - 1) + a.val + b.val;
  45. return ret;
  46. }
  47.  
  48. void postavi(int x, int real_x) {
  49. x += offset;
  50. p[x].x = p[x].y = real_x;
  51. p[x].set = 1;
  52. p[x].val = p[x].last_val = 1;
  53. x /= 2;
  54. while (x) {
  55. p[x] = merge(p[x * 2], p[x * 2 + 1], p[x].last_val);
  56. x /= 2;
  57. }
  58. }
  59.  
  60. void send_prop(int x) {
  61. if (!p[x].prop) return;
  62. FOR(i, x * 2, x * 2 + 2) {
  63. p[i].val = p[i].y - p[i].x + 1 - p[i].val;
  64. p[i].prop ^= 1;
  65. p[i].last_val ^= 1;
  66. }
  67. p[x].prop = 0;
  68. }
  69.  
  70. void update(int cvor, int l, int r, int a, int b) {
  71. if (l > b || r < a) return;
  72. if (l >= a && r <= b) {
  73. p[cvor].val = p[cvor].y - p[cvor].x + 1 - p[cvor].val;
  74. p[cvor].prop ^= 1;
  75. p[cvor].last_val ^= 1;
  76. return;
  77. }
  78.  
  79. send_prop(cvor);
  80.  
  81. int mid = (l + r) / 2;
  82. update(cvor * 2, l, mid, a, b);
  83. update(cvor * 2 + 1, mid + 1, r, a, b);
  84. p[cvor] = merge(p[cvor * 2], p[cvor * 2 + 1], p[cvor].last_val);
  85. }
  86.  
  87. int get() {
  88. return p[1].val;
  89. }
  90.  
  91. void print() {
  92. FOR(i, 1, 2 * offset) TRACE(p[i].last_val _ p[i].val _ p[i].prop _ p[i].x _ p[i].y _ p[i].set);
  93. }
  94. }T;
  95.  
  96. int m, n, k;
  97. int a, b, c, d;
  98.  
  99. vector <int> v;
  100.  
  101. vector <pair <pii, pii> > ev;
  102.  
  103. int get(int t) {
  104. return (int)(lower_bound(v.begin(), v.end(), t) - v.begin());
  105. }
  106.  
  107. int main() {
  108. scanf("%d %d %d",&n,&m,&k);
  109. REP(i, k) {
  110. scanf("%d %d %d %d",&a,&b,&c,&d);
  111. v.push_back(c);
  112. v.push_back(d);
  113. ev.push_back({{a, -1}, {c, d}});
  114. ev.push_back({{b, 1}, {c, d}});
  115. }
  116. v.push_back(1);
  117. v.push_back(m);
  118. sort(v.begin(), v.end());
  119. sort(ev.begin(), ev.end());
  120.  
  121. v.erase(unique(v.begin(), v.end()), v.end());
  122. REP(i, (int)v.size()) T.postavi(i, v[i]);
  123.  
  124. int last = ev[0].X.X;
  125. llint sol = 0;
  126. REP(i, (int)ev.size()) {
  127. int x = ev[i].X.X;
  128. vector <pii> add, rem;
  129. for (int j = i; j < (int)ev.size() && ev[j].X.X == ev[i].X.X; j++) {
  130. if (ev[j].X.Y == -1) add.push_back({get(ev[j].Y.X), get(ev[j].Y.Y)});
  131. else rem.push_back({get(ev[j].Y.X), get(ev[j].Y.Y)});
  132. }
  133. int prije = T.get();
  134. sol += (llint)prije * (x - last);
  135. if (x == n && add.empty()) sol += prije;
  136. REP(j, (int)add.size()) T.update(1, 0, offset - 1, add[j].X, add[j].Y);
  137. last = x;
  138. if (!add.empty()) {
  139. last++;
  140. sol += T.get();
  141. }
  142. REP(j, (int)rem.size()) T.update(1, 0, offset - 1, rem[j].X, rem[j].Y);
  143. while (i < (int)ev.size() && ev[i].X.X == x) i++;
  144. i--;
  145. }
  146.  
  147. printf("%lld\n", sol);
  148.  
  149. return 0;
  150. }
Add Comment
Please, Sign In to add comment