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


def canput( list, n )
	return true if list.size == 0
	if list[ -1 ] < n
		return true
	else
		return false
	end
end

def put_try( listB, listC, left )

	return true if left.size == 0

	newleft = left.dup
	n = newleft.shift
	if canput( listB, n ) == true
		newlistB = listB.dup
		newlistC = listC.dup
		newlistB << n 
		b = put_try( newlistB, newlistC, newleft )
		return true if b
	end
	if canput( listC, n ) == true
		newlistB = listB.dup
		newlistC = listC.dup
		newlistC << n 
		b = put_try( newlistB, newlistC, newleft )
		return true if b
	end
	return false
end

def checkball( balls )
	listB = Array.new	
	listC = Array.new
	listB << balls.shift

	return put_try( listB, listC, balls )
end

answers = Array.new
num = $stdin.gets.chomp.to_i
num.times{
	list = $stdin.gets.chomp.split( /\s/ ).map{ |n| n.to_i}
	answers << checkball( list )
}
answers.each{ |a|
	if a
		puts "YES"
	else
		puts "NO"
	end
}