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 JAVA (judge verdict: Accepted)

import java.util.Scanner;

/**
 * Created by sotetsuk on 2015/07/31.
 */
public class Main {
    static final int K = 10;
    static int N;
    static int[] balls = new int[10];
    static Scanner sc = new Scanner(System.in);
    static int l, r;

    public static void read() {
        for(int i = 0; i < K; i++) {
            balls[i] = sc.nextInt();
        }
    }

    public static boolean dfs(int i) {
        // stop condition
        if(i == K) return true;

        // recursive
        boolean flag_l = false; boolean flag_r = false;
        if(l == -1 || balls[l] < balls[i]) {
            int tmp_l = l; l = i; flag_l = dfs(i + 1); l = tmp_l;
        }
        if(r == -1 || balls[r] < balls[i]) {
            int tmp_r = r; r = i; flag_r = dfs(i + 1); r = tmp_r;
        }
        return flag_l || flag_r;
    }

    public static void solve() {
        l = -1; r = -1;
        String ans = dfs(0) ? "YES" : "NO";
        System.out.println(ans);
    }

    public static void main(String[] args) {
        N = sc.nextInt();
        for(int i = 0; i < N; i++) {
            read();
            solve();
        }

    }
}