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