예제 #1
0
        public static void Solve()
        {
            var(N, Q) = Scanner.Scan <int, int>();
            var S = Scanner.Scan <string>();

            int Score(char c) => c switch
            {
                '(' => 1,
                ')' => - 1,
                _ => default
            };

            var seg = new SegmentTree <Monoid>(N, new Oracle());

            for (var i = 0; i < N; i++)
            {
                var score = Score(S[i]);
                seg.Set(i, new Monoid(score, score));
            }

            while (Q-- > 0)
            {
                var(q, l, r) = Scanner.Scan <int, int, int>();
                l--;
                if (q == 1)
                {
                    r--;
                    var(lv, rv) = (seg.Get(l), seg.Get(r));
                    seg.Set(l, rv);
                    seg.Set(r, lv);
                }
                else
                {
                    var x      = seg.Query(l, r);
                    var answer = x.Value == 0 && x.Min >= 0;
                    Console.WriteLine(answer ? "Yes" : "No");
                }
            }
        }
예제 #2
0
        public static void Solve()
        {
            var(N, K) = Scanner.Scan <int, int>();
            const int max = 3 * (int)1e5 + 5;
            var       st  = new SegmentTree <int>(max, (a, b) => Math.Max(a, b), 0);

            for (var i = 0; i < N; i++)
            {
                var A = Scanner.Scan <int>();
                var l = Math.Max(0, A - K);
                var r = Math.Min(A + K, max - 1) + 1;
                st.Set(A, st.Query(l, r) + 1);
            }

            Console.WriteLine(st.Query(0, max));
        }
예제 #3
0
        public static void Solve()
        {
            var(N, Q) = Scanner.Scan <int, int>();
            var A  = Scanner.ScanEnumerable <int>().ToArray();
            var st = new SegmentTree <int>(A, new Oracle());

            while (Q-- > 0)
            {
                var(T, X, Y) = Scanner.Scan <int, int, int>();
                X--;
                if (T == 1)
                {
                    st.Set(X, st.Get(X) ^ Y);
                }
                else
                {
                    Console.WriteLine(st.Query(X, Y));
                }
            }
        }