Пример #1
0
    static void Main()
    {
        string[] str;

        str = Console.ReadLine().Split(' ');
        int N = int.Parse(str[0]), Q = int.Parse(str[1]);

        var st = new LazySegTree <Node, int>(N, merge, resolve, postpone, new Node(0, 0, 1));

        str = Console.ReadLine().Split(' ');
        for (int i = 0; i < N; ++i)
        {
            var A = int.Parse(str[i]);
            if (A == 0)
            {
                st.Update(i, i + 1, 1);
            }
        }

        for (int q = 0; q < Q; ++q)
        {
            str = Console.ReadLine().Split(' ');
            int T = int.Parse(str[0]), L = int.Parse(str[1]), R = int.Parse(str[2]);
            if (T == 1)
            {
                st.Update(L - 1, R, 1);
            }
            else
            {
                Console.WriteLine(st.Query(L - 1, R).ninv);
            }
        }
    }
Пример #2
0
        public static void Solve()
        {
            var(N, Q) = Scanner.Scan <int, int>();
            var            A         = Scanner.ScanEnumerable <int>().Select(x => x == 0 ? new S(1, 0, 0) : new S(0, 1, 0)).ToArray();
            Func <S, S, S> operation = (l, r) =>
                                       new S(l.Zero + r.Zero, l.One + r.One, l.Inversion + r.Inversion + l.One * r.Zero);
            var identityS = new S(0, 0, 0);
            Func <bool, S, S>       mapping     = (l, r) => l ? new S(r.One, r.Zero, r.One * r.Zero - r.Inversion) : r;
            Func <bool, bool, bool> composition = (l, r) => (l && !r) || (!l && r);
            var identityF = false;

            var lseg = new LazySegTree <S, bool>(A, operation, identityS, mapping, composition, identityF);

            for (var i = 0; i < Q; i++)
            {
                var(T, L, R) = Scanner.Scan <int, int, int>();
                L--;
                if (T == 1)
                {
                    lseg.Apply(L, R, true);
                }
                else
                {
                    Console.WriteLine(lseg.Prod(L, R).Inversion);
                }
            }
        }
Пример #3
0
    static void Main()
    {
        var str = Console.ReadLine().Split(' ');
        int H = int.Parse(str[0]), W = int.Parse(str[1]);

        var st = new LazySegTree <long, Barrier>(W, merge, resolve, postpone);

        for (int h = 0; h < H; ++h)
        {
            str = Console.ReadLine().Split(' ');
            int A = int.Parse(str[0]), B = int.Parse(str[1]);
            var v = A == 1 ? INF: st.Query(A - 2, A - 1);
            st.Update(A - 1, B, new Barrier(A - 2, v));

            var ans = h + 1 + st.Query(0, W);
            Console.WriteLine(ans > INF ? -1 : ans);
        }
    }
Пример #4
0
    static void Main()
    {
        var str = Console.ReadLine().Split(' ');
        int N = int.Parse(str[0]), Q = int.Parse(str[1]);

        S = new long[N + 1];
        for (int i = 0; i < N; ++i)
        {
            S[i + 1] = (S[i] * 10 + 1) % mod;
        }

        var st = new LazySegTree <long, long>(N, merge, resolve, postpone);

        st.Update(0, N, 1);

        for (int q = 0; q < Q; ++q)
        {
            str = Console.ReadLine().Split(' ');
            int L = int.Parse(str[0]), R = int.Parse(str[1]), D = int.Parse(str[2]);
            st.Update(N - R, N - L + 1, D);
            Console.WriteLine(st.Query(0, N));
        }
    }