void Calc() { int N = re.i(); int[] B = re.ia(); int Q = re.i(); Data[] D = new Data[Q]; for (int i = 0; i < Q; i++) { D[i] = new Data(re.i() - 1, re.i() - 1); } Array.Sort(D, (x, y) => (x.l - y.l)); SegTree Seg = new SegTree(N + 1, this); for (int i = 2 * N; i >= 0; i--) { if (i >= Seg.segf) { Seg.X[i] = Seg.ToPoint(i) == 0 ? 0 : 10000000; } else { int sl = i * 2 + 1; int sr = i * 2 + 2; Seg.X[i] = Math.Min(Seg.X[sl], Seg.X[sr]); } } int p = 0; { while (p < Q && D[p].l == 0) { Seg.Change(D[p].r + 1, 0); p++; } } for (int i = 0; i < N; i++) { if (i != 0) { Seg.Change(i, Seg.Min(i - 1, i)); } if (B[i] == 1) { Seg.Add(i, i, 1); } else { Seg.Add(i + 1, N, 1); } while (p < Q && D[p].l == i + 1) { Seg.Change(D[p].r + 1, Seg.Min(i, D[p].r + 1)); p++; } } sb.Append(Seg.Min(N - 1, N) + "\n"); }