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: Wrong Answer)


import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	private static final int LEFT = 0;
	private static final int RIGHT = 1;
	private static final int EndOfDirection = 2;
	
	private static ArrayList<Integer> a = new ArrayList<Integer>(10);
	private static ArrayList<Integer> left = new ArrayList<Integer>(10);
	private static ArrayList<Integer> right = new ArrayList<Integer>(10);
	private static ArrayList<String> result = new ArrayList<String>();
	private static Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
	
		int numDataSet = sc.nextInt();
		for(int i = 0; i < numDataSet; i++){
			pushBallsToA();
			if(popBallsAscendingOrder()){
				result.add("YES");
			}
			else{
				result.add("NO");
			}
		}
		
		for(int i = 0; i < result.size(); i++){
			System.out.println(result.get(i));
		}
	}
	
	public static void setA(ArrayList<Integer> a) {
		Main.a = a;
	}
	
	public static void pushBallsToA(){
		a.clear();
		for(int i = 0; i < 10; i++){
			a.add(sc.nextInt());
		}
	}
	
	public static boolean popBallsAscendingOrder(){
		left.clear();
		right.clear();
		for(int directionBall1 = LEFT; directionBall1 < EndOfDirection; directionBall1++){
			for(int directionBall2 = LEFT; directionBall2 < EndOfDirection; directionBall2++){
				for(int directionBall3 = LEFT; directionBall3 < EndOfDirection; directionBall3++){
					for(int directionBall4 = LEFT; directionBall4 < EndOfDirection; directionBall4++){
						for(int directionBall5 = LEFT; directionBall5 < EndOfDirection; directionBall5++){
							for(int directionBall6 = LEFT; directionBall6 < EndOfDirection; directionBall6++){
								for(int directionBall7 = LEFT; directionBall7 < EndOfDirection; directionBall7++){
									for(int directionBall8 = LEFT; directionBall8 < EndOfDirection; directionBall8++){
										for(int directionBall9 = LEFT; directionBall9 < EndOfDirection; directionBall9++){
											for(int directionBall10 = LEFT; directionBall10 < EndOfDirection; directionBall10++){
												popBall(directionBall1, 0);
												popBall(directionBall2, 1);
												popBall(directionBall3, 2);
												popBall(directionBall4, 3);
												popBall(directionBall5, 4);
												popBall(directionBall6, 5);
												popBall(directionBall7, 6);
												popBall(directionBall8, 7);
												popBall(directionBall9, 8);
												popBall(directionBall10, 9);
												/*
												System.out.print("left:");
												for(int i = 0; i < left.size(); i++){
													System.out.print(left.get(i) + " ");
												}
												System.out.println();
												System.out.print("right:");
												for(int i = 0; i < right.size(); i++){
													System.out.print(right.get(i) + " ");
												}
												System.out.println();
												*/
												if(isAscendingOrder(left) && isAscendingOrder(right)){
													return true;
												}
												left.clear();
												right.clear();
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}		
		return false;
	}
	
	private static void popBall(int direction, int indexBall){
		switch(direction){
		case LEFT:
			left.add(a.get(indexBall));
			break;
		case RIGHT:
			right.add(a.get(indexBall));
			break;
		}
	}
	
	public static boolean isAscendingOrder(ArrayList<Integer> list){		
		for(int i = 0; i < list.size() - 2; i++){
			if(list.get(i) > list.get(i + 1)){
				return false;
			}
		}
		return true;
	}
}