static void Main() { var h = Read(); var n = h[0]; var qs = new int[h[1]].Select(_ => Read()).Select(v => (v[0], v[1], v[2])).ToArray(); var a = Enumerable.Range(0, n + 2).ToArray(); var st = new ST(n + 2); var q = new Queue <int>(); var set = new HashSet <int>(); void Reverse(int x) { Swap(a, x, x + 1); for (int i = -1; i < 2; i++) { st.Set(x + i, a[x + i] < a[x + i + 1] ? 0 : 1); } } foreach (var(t, x, y) in qs) { if (t == 1) { Reverse(x); } else { foreach (var i in st.GetIndexes(x, y - 1)) { q.Enqueue(i); set.Add(i); } while (q.TryDequeue(out var i)) { Reverse(i); set.Remove(i); if (x <= i - 1 && !set.Contains(i - 1) && st.Get(i - 1) > 0) { q.Enqueue(i - 1); set.Add(i - 1); } if (i + 1 < y && !set.Contains(i + 1) && st.Get(i + 1) > 0) { q.Enqueue(i + 1); set.Add(i + 1); } } } } Console.WriteLine(string.Join(" ", a.Skip(1).Take(n))); }