示例#1
0
    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)));
    }