Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 200005;
- int T[N << 2], lz[N << 2];
- #define mid ((l + r) >> 1)
- void push(int v, int l, int r) {
- if (lz[v] == 0) return;
- if (l < r) lz[v << 1] += lz[v], lz[v << 1 | 1] += lz[v];
- T[v] += lz[v]; T[v] = min(T[v], N); lz[v] = 0;
- }
- void upd_pos(int v, int l, int r, int x, int val) {
- push(v, l, r);
- if (l > r || l > x || r < x) return;
- if (l == r) { T[v] = val; return; }
- upd_pos(v << 1, l, mid, x, val); upd_pos(v << 1 | 1, mid + 1, r, x, val);
- T[v] = min(T[v << 1], T[v << 1 | 1]);
- }
- void upd(int v, int l, int r, int L, int R, int val) {
- push(v, l, r);
- if (l > r || R < l || L > r) return;
- if (L <= l && r <= R) { lz[v] = val; push(v, l, r); return; }
- upd(v << 1, l, mid, L, R, val); upd(v << 1 | 1, mid + 1, r, L, R, val);
- T[v] = min(T[v << 1], T[v << 1 | 1]);
- }
- int get(int v, int l, int r, int L, int R) {
- push(v, l, r);
- if (l > r || R < l || L > r) return N;
- if (L <= l && r <= R) return T[v];
- return min(get(v << 1, l, mid, L, R), get(v << 1 | 1, mid + 1, r, L, R));
- }
- #undef mid
- int n, q;
- int b[N];
- vector<int> Q[N];
- int f[N][2];
- int main() {
- scanf("%d", &n);
- for (int i = 1; i <= n; ++i) {
- scanf("%d", &b[i]);
- if (b[i] == 0) f[i][1] = 1; else f[i][0] = 1;
- }
- scanf("%d", &q);
- while(q--) {
- int l, r; scanf("%d %d", &l, &r);
- Q[l].push_back(r);
- }
- for (int i = 0; i < 4 * N; ++i) T[i] = N;
- upd_pos(1, 0, n, 0, 0);
- for (int i = 1; i <= n; ++i) {
- sort(Q[i].begin(), Q[i].end(), greater<int>());
- for (int j : Q[i]) {
- int mn = get(1, 0, n, 0, j);
- upd_pos(1, 0, n, j, mn);
- }
- upd(1, 0, n, 0, i - 1, f[i][0]);
- upd(1, 0, n, i, n, f[i][1]);
- }
- printf("%d\n", get(1, 0, n, 0, n));
- }
Add Comment
Please, Sign In to add comment