Problem:
玉

図のように二股に分かれている容器があります。1 から 10 までの番号が付けられた10 個の玉を容器の開口部 A から落とし、左の筒 B か右の筒 C に玉を入れます。板 D は支点 E を中心に左右に回転できるので、板 D を動かすことで筒 B と筒 C のどちらに入れるか決めることができます。

開口部 A から落とす玉の並びを与えます。それらを順番に筒 B 又は筒 Cに入れていきます。このとき、筒 B と筒 C のおのおのが両方とも番号の小さい玉の上に大きい玉を並べられる場合は YES、並べられない場合は NO と出力するプログラムを作成してください。ただし、容器の中で玉の順序を入れ替えることはできないものとします。また、続けて同じ筒に入れることができるものとし、筒 B, C ともに 10 個の玉がすべて入るだけの余裕があるものとします。

Input

複数のデータセットが与えられます。１行目にデータセット数 N が与えられます。つづいて、N 行のデータセットが与えられます。各データセットに 10 個の番号が左から順番に空白区切りで与えられます。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

2
3 1 4 2 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

Output for the Sample Input

YES
NO

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    void Solve()
    {
        int T = read.NextInt();
        while (T-- > 0)
        {
            int[] A = read.NextIntArray();
            if (DFS(0, A, -1, -1)) Console.WriteLine("YES");
            else Console.WriteLine("NO");
        }
    }
    bool DFS(int i, int[] A, int preva, int prevb)
    {
        if (i == A.Length) return true;
        if (A[i] > preva && DFS(i + 1, A, A[i], prevb)) return true;
        if (A[i] > prevb && DFS(i + 1, A, preva, A[i])) return true;
        return false;
    }

    static void Main() { new Program().Solve(); }
    static Read read = new Read();
    class Read
    {
        private Queue<string> que = new Queue<string>();
        public string Next() { return Dequeue(); }
        public int NextInt() { return int.Parse(Dequeue()); }
        public long NextLong() { return long.Parse(Dequeue()); }
        public double NextDouble() { return double.Parse(Dequeue()); }
        public int[] NextIntArray() { return Array.ConvertAll(Console.ReadLine().Split(), int.Parse); }
        private string Dequeue()
        {
            if (que.Count == 0) foreach (var s in Console.ReadLine().Split()) que.Enqueue(s);
            return que.Dequeue();
        }
    }
}