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"); } } }
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)); } } }