Go: package main

import "fmt"

func isOrdered(a []int) bool {
	if len(a) <= 1 {
		return true
	}
	for i := 0; i+1 < len(a); i++ {
		if a[i] > a[i+1] {
			return false
		}
	}
	return true
}

func main() {
	// ボールの数がせいぜい10個しかないので、全てのボールの落とし方を全探索することが可能
	// Bit全探索を行う。右から見てj番目のビットが立っているときには左側の筒、立っていない時は右側の筒にいれる物とする。
	// 全てのボールを落とし終わった後に、それぞれの筒で昇順に並んでいるか調べることにする。
	var t int
	fmt.Scan(&t)
	ans := make([]bool, t)
	for i := 0; i < t; i++ {
		balls := make([]int, 10)
		for i := range balls {
			fmt.Scan(&balls[i])
		}
		ans[i] = false
		for bits := 0; bits < (1 << uint(10)); bits++ {
			pipeB := make([]int, 0)
			pipeC := make([]int, 0)
			for j := 0; j < 10; j++ {
				if (bits & (1 << uint(j))) != 0 {
					pipeB = append(pipeB, balls[j])
				} else {
					pipeC = append(pipeC, balls[j])
				}
			}
			if isOrdered(pipeB) && isOrdered(pipeC) {
				// fmt.Printf("test case %d - OK pattern - pipeB %v, pipec %v\n", i, pipeB, pipeC)
				ans[i] = true
				break
			}
		}
	}
	for i := range ans {
		if ans[i] {
			fmt.Println("YES")
		} else {
			fmt.Println("NO")
		}
	}
}

C++: #include<iostream>
int main()
{
	int N;
	std::cin >> N;
	for (int i = 0; i < N; i++)
	{
		int b_back = 0, c_back = 0;
		bool is_OK = true;
		for (int j = 0; j < 10; j++)
		{
			int num;
			std::cin >> num;
			if (num < b_back && num < c_back)
			{
				is_OK = false;
				break;
			}
			else if (num > b_back && num < c_back)
			{
				b_back = num;
			}
			else if (num < b_back && num > c_back)
			{
				c_back = num;
			}
			else
			{
				if (b_back > c_back)
				{
					b_back = num;
				}
				else
				{
					c_back = num;
				}
			}
		}
		std::cout << (is_OK ? "YES" : "NO") << std::endl;
	}
	return 0;
}

C++: #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

#define rep(i,j) REP((i), 0, (j))
#define REP(i,j,k) for(int i=(j);(i)<(k);++i)
#define BW(a,x,b) ((a)<=(x)&&(x)<=(b))
#define ALL(v) (v).begin(), (v).end()
#define LENGTHOF(x) (sizeof(x) / sizeof(*(x)))
#define AFILL(a, b) fill((int*)a, (int*)(a + LENGTHOF(a)), b)
#define MP make_pair
#define PB push_back
#define F first
#define S second
#define INF 1 << 30
#define EPS 1e-10

typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef vector<int> vi;
typedef queue<int> qi;
typedef long long ll;

int N;
vector<int>a;

int dfs(int n, int b, int c){
  if(n == 10) return 1;

  if(b < a[n] && dfs(n+1, a[n], c)) return 1;
  if(c < a[n] && dfs(n+1, b, a[n])) return 1;
  return 0;
}

int main(){
  scanf("%d", &N);
  rep(i, N){
    a.clear();
    int b;
    rep(i, 10){
      scanf("%d", &b);
      a.PB(b);
    }

    printf("%s\n", dfs(0, 0, 0)?"YES":"NO");
  }
  return 0;
}

C++: #include <stdio.h>
#include <stack>

using namespace std;

int main(void){
	int n = 0;
	int a[10];
	stack<int> b, c;
	bool r = true;

	scanf("%d", &n);
	for(int i=0;i<n;++i){
		for(int j=0;j<10;++j){
			scanf("%d", a+j);
		}
		b = stack<int>();
		c = stack<int>();
		r = true;

		for(int j=0;j<10;++j){
			if(b.empty() ||
				(c.empty() && b.top() < a[j])){
				b.push(a[j]);
			}else if(c.empty()){
				c.push(a[j]);
			}else if(b.top() < a[j] && c.top() < a[j]){
				if(b.top() > c.top()){
					b.push(a[j]);
				}else{
					c.push(a[j]);
				}
			}else if(b.top() < a[j]){
				b.push(a[j]);
			}else if(c.top() <a[j]){
				c.push(a[j]);
			}else{
				r = false;
				break;
			}
		}
		puts(r ? "YES": "NO");
	}
	return 0;
}

C++: #include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>
#define shosu(x) fixed<<setprecision(x)
using namespace std;
const int inf=10000000;

int n,num[10];

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		vector<int> l,r;
		l.push_back(-1*inf);
		r.push_back(-1*inf);
		bool ans=true;
		for(int j=0;j<10;j++){
			cin>>num[j];
		}
		l.push_back(num[0]);
		for(int j=1;j<10;j++){
			if(num[j]>l.back()&&num[j]>r.back()){
				if(l.back()>=r.back()) l.push_back(num[j]);
				else r.push_back(num[j]);
			}
			else{
				if(num[j]<=l.back()&&num[j]<=r.back()) ans=false;
				else{
					if(num[j]>l.back()) l.push_back(num[j]);
					else r.push_back(num[j]);
				}
			}
		}
		if(ans) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
}

C++: #include<iostream>
#include<sstream>
#include<fstream>
#include<cstdio>
#include<vector>
#include<list>
#include<stack>
#include<queue>
#include<deque>
#include<bitset>
#include<map>
#include<set>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<cmath>
#include<cstring>
using namespace std;

using namespace std;
bool solve(deque<int> toAdd, deque<int> l,deque<int> r){
	if(toAdd.size()==0)return true;
	bool flag = false;
	if(l[l.size()-1]<toAdd.front()){
		int j = toAdd.front();
		toAdd.pop_front();
		l.push_back(j);
		flag = flag || solve(toAdd,l,r);
		//back to original problem
		toAdd.push_front(j);
	        l.pop_back();
	}
	if(flag)return true;
	if(r[r.size()-1]<toAdd.front()){
		int j = toAdd.front();
		toAdd.pop_front();
		r.push_back(j);
		flag = flag || solve(toAdd,l,r);
	}
	return flag;
}
int main(){
	int n;
	cin>>n;
	while(n-->0){
		deque<int> balls;
		for(int x=0;x<10;++x){
			int j;cin>>j;
			balls.push_back(j);
		}
		deque<int> sol;sol.push_back(0);
		if(solve(balls,sol,sol)){
			cout<<"YES"<<endl;
		}else{
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

C++: #include<iostream>
#include<vector>
using namespace std;
int main(){
	int time;
	cin>>time;
	int ball[10];
	vector<int> line1;
	vector<int> line2;
	for(int i2=0;i2<time;++i2){
		for(int i=0;i<10;++i){
			cin>>ball[i];
		}
		line1.push_back(ball[9]);
		for(int i=8;i>=0;--i){
			if(line1.back()>ball[i])line1.push_back(ball[i]);
			else if(line2.empty()||line2.back()>ball[i])line2.push_back(ball[i]);
			else {
				cout<<"NO"<<endl;
				goto NO;
			}
		}
		cout<<"YES"<<endl;
		NO:;
	}
	return 0;
}

C++: #include<stdio.h>
main(){
    int x[10],y[10],z[10],i,j,n,cz,cy,tmp;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        tmp=0;
        cy=0;cz=0;
        for(j=0;j<10;j++){
        scanf("%d",&x[j]);
        z[j]=0;y[j]=0;
        }
        for(j=0;j<10;j++){
        if(x[j]>=y[cy-1*(cy>0)])
        y[cy++]=x[j];
        else if(x[j]>=z[cz-1*(cz>0)])
        z[cz++]=x[j];
        else
        tmp=1;
        }
        if(tmp==1)
        printf("NO\n");
        else
        printf("YES\n");
        for(j=0;j<10;j++)
        printf("%d ",y[j]);
        printf("\n");
        for(j=0;j<10;j++)
        printf("%d ",z[j]);
        printf("\n");
    }
}

C++: #include <iostream>
#include <stack>
#include <queue>
using namespace std;

bool able;
void rec(queue<int> A,stack<int> B,stack<int> C){
	if( A.empty() ){
		able = true;
		return;
	}
	
	int tp = A.front();
	
	A.pop();
	
	if(tp > B.top() ){
	 	B.push(tp);
	 	rec(A,B,C);
	}
	if(tp > C.top() ){
	 	C.push(tp);
	 	rec(A,B,C);
	}
	
	return ;
}
int main(){
	int n,t;
	stack<int>a,b;
	a.push(0);
	b.push(0);
	cin >> n;
	while(n--){
		queue<int>input;
			able = false;
		for(int i=0;i<10;i++){
			cin >> t;
			input.push(t);
		}
		rec(input,a,b);
		cout << (able?"YES":"NO") << endl;
	}
}