Пример #1
0
    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");
    }