cheater2k

ARC085 - F

Nov 18th, 2017
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 200005;
  5. int T[N << 2], lz[N << 2];
  6.  
  7. #define mid ((l + r) >> 1)
  8. void push(int v, int l, int r) {
  9. if (lz[v] == 0) return;
  10. if (l < r) lz[v << 1] += lz[v], lz[v << 1 | 1] += lz[v];
  11. T[v] += lz[v]; T[v] = min(T[v], N); lz[v] = 0;
  12. }
  13.  
  14. void upd_pos(int v, int l, int r, int x, int val) {
  15. push(v, l, r);
  16. if (l > r || l > x || r < x) return;
  17. if (l == r) { T[v] = val; return; }
  18. upd_pos(v << 1, l, mid, x, val); upd_pos(v << 1 | 1, mid + 1, r, x, val);
  19. T[v] = min(T[v << 1], T[v << 1 | 1]);
  20. }
  21.  
  22. void upd(int v, int l, int r, int L, int R, int val) {
  23. push(v, l, r);
  24. if (l > r || R < l || L > r) return;
  25. if (L <= l && r <= R) { lz[v] = val; push(v, l, r); return; }
  26. upd(v << 1, l, mid, L, R, val); upd(v << 1 | 1, mid + 1, r, L, R, val);
  27. T[v] = min(T[v << 1], T[v << 1 | 1]);
  28. }
  29.  
  30. int get(int v, int l, int r, int L, int R) {
  31. push(v, l, r);
  32. if (l > r || R < l || L > r) return N;
  33. if (L <= l && r <= R) return T[v];
  34. return min(get(v << 1, l, mid, L, R), get(v << 1 | 1, mid + 1, r, L, R));
  35. }
  36. #undef mid
  37.  
  38. int n, q;
  39. int b[N];
  40. vector<int> Q[N];
  41. int f[N][2];
  42.  
  43. int main() {
  44. scanf("%d", &n);
  45. for (int i = 1; i <= n; ++i) {
  46. scanf("%d", &b[i]);
  47. if (b[i] == 0) f[i][1] = 1; else f[i][0] = 1;
  48. }
  49. scanf("%d", &q);
  50. while(q--) {
  51. int l, r; scanf("%d %d", &l, &r);
  52. Q[l].push_back(r);
  53. }
  54.  
  55. for (int i = 0; i < 4 * N; ++i) T[i] = N;
  56. upd_pos(1, 0, n, 0, 0);
  57.  
  58. for (int i = 1; i <= n; ++i) {
  59. sort(Q[i].begin(), Q[i].end(), greater<int>());
  60. for (int j : Q[i]) {
  61. int mn = get(1, 0, n, 0, j);
  62. upd_pos(1, 0, n, j, mn);
  63. }
  64. upd(1, 0, n, 0, i - 1, f[i][0]);
  65. upd(1, 0, n, i, n, f[i][1]);
  66. }
  67.  
  68. printf("%d\n", get(1, 0, n, 0, n));
  69. }
Advertisement
Add Comment
Please, Sign In to add comment