Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var sc = bufio.NewScanner(os.Stdin)

func main() {
	var num int
	fmt.Scan(&num)

	for i := 0; i < num; i++ {
		sc.Scan()
		line := sc.Text()

		insertCheck(line)
	}
}

func insertCheck(line string) {
	var B, C []int

	for _, v := range strings.Split(line, " ") {
		ball, _ := strconv.Atoi(v)
		switch {
		case len(B) == 0:
			B = append(B, ball)
		case B[len(B)-1] < ball:
			B = append(B, ball)
		case B[len(B)-1] >= ball:
			switch {
			case len(C) == 0:
				C = append(C, ball)
			case C[len(C)-1] < ball:
				C = append(C, ball)
			case C[len(C)-1] >= ball:
				fmt.Println("NO")
				return
			}
		}
	}
	fmt.Println("YES")
}

C++: #include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<cmath>
#include<utility>
#define ll long long int
#define ld long double
#define INF 1000000000
#define EPS 0.0000000001
#define rep(i,n) for(i=0;i<n;i++)
using namespace std;
typedef pair<int, int> P;

string str;

int main()
{
  int n;
  int max1=0,max2=0;
  int i,j;
  int num;

  cin>>n;

  rep(i,n){
    rep(j,10){

      scanf("%d",&num);

      if(max1>num && max2>num){
	cout<<"NO"<<endl;
	break;
      }
      else if(max1>num)
	max2=num;
      else if(max2>num)
	max1=num;
      else
	max1>max2 ? max1=num : max2=num;

    }//repj
    if(j==10)
      cout<<"YES"<<endl;
  }//repi
}

C++: #include <iostream>
using namespace std;
 
int Balls[10];
 
bool fork(int balls[], int i, int b, int c) {
  if (i == 10) return true;
  if (b > balls[i] && c > balls[i]) return false;
  if (b < balls[i]) fork(balls, i + 1, balls[i], c);
  if (c < balls[i]) fork(balls, i + 1, b, balls[i]);
}
 
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 10; j++) {
      cin >> Balls[j];
    }
    if(fork(Balls, 0, 0, 0)) cout << "YES" << endl;
    else cout << "NO" << endl;
  }
  return 0;
}

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

int main(){
    int n;
    cin >> n;
    for (int i = 0; i < n; i++){
	
	stack<int> b, c;
	b.push(0); c.push(0);
	bool canBeSorted = true;

	int g;
	for (int j = 0; j < 10; j++){
	    cin >> g;
	    if (g <= b.top() && g <= c.top()){ canBeSorted = false; break; }
	    if (g - b.top() <= g - c.top() && g - b.top() > 0) b.push(g);
	    else c.push(g);
	}

	if (canBeSorted) cout << "YES" << endl;
	else cout << "NO" << endl;
    }
    
    
}

C++: #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int ball[15],chk;
void dfs(int k, int r, int l);
int main(){
  int n;
  scanf("%d",&n);
  for(int i = 0; i < n; i++){
    for(int j = 0; j < 10; j++){
      scanf("%d",&ball[j]);
    }
    chk = 0;
    dfs(0,0,0);
    if(chk == 1)cout << "YES" << endl;
    else cout << "NO" << endl;
  }
}
void dfs(int k, int r, int l){
  if(k == 10){
    chk = 1;
    return ;
  }
  if(l < ball[k])dfs(k + 1, r,ball[k]);
  if(r < ball[k])dfs(k + 1,ball[k], l);
}

C++: #include <iostream>
#include <algorithm>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
int main(){
	int n;
	cin >> n;
	while(n--){
		int d[10];
		int dp[10]={1,1,1,1,1,1,1,1,1,1},m[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
		rep(i,10) cin >> d[i];
		rep(i,10) rep(j,i) if(d[j] < d[i]) if(dp[i] <= dp[j]){ dp[i] = dp[j]+1 , m[i] = j;}
		int p = find( dp , dp+10 , *max_element( dp , dp+10 ) ) - dp;
		while(~p){ d[p] = -1; p = m[p];}
		bool ans = true; int prev = -1;
		rep(i,10) if(~d[i]){
			if(d[i] > prev) prev = d[i];
			else ans = false;
		}
		cout << (ans ? "YES" : "NO") << endl;
	}
}

C++: #include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;

stack<int> B, C;
int A[10];

bool dfs(int index)
{
  bool ret = false;
  char s[11];

  if (index >= 10) {
    return true;
  }

  for (int i = 0; i < 11; i++) {
    if (i < index) s[i] = '>';
    else s[i] = 0;
  }

  if (B.empty() || B.top() < A[index]) {
    B.push(A[index]);
    // printf("%spush %d into B\n", s, A[index]);
    ret = dfs(index + 1);
    // printf("%s%s. pop %d from B\n", s, ret ? "succeeded" : "failed", A[index]);
    B.pop();
  }
  if (!ret && (C.empty() || C.top() < A[index])) {
    C.push(A[index]);
    // printf("%spush %d into C\n", s, A[index]);
    ret = dfs(index + 1);
    // printf("%s%s. pop %d from C\n", s, ret ? "succeeded" : "failed", A[index]);
    C.pop();
  }

  return ret;
}

bool solve()
{
  while (!B.empty()) B.pop();
  while (!C.empty()) C.pop();

  B.push(A[0]);
  bool ret = dfs(1);
  B.pop();

  return ret;
}

int main()
{
  int N;
  scanf("%d", &N);

  for (int i = 0; i < N; i++) {
    for (int j = 0; j < 10; j++) {
      scanf("%d", A + j);
    }

    if (solve()) {
      printf("Yes\n");
    }
    else {
      printf("No\n");
    }
  }

  return 0;
}

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

int main(){
	int num;
	cin>>num;
	int error=0;
	for(int x=0;x<num;x++){
		error=0;
		queue<int> A;
		vector<int> B;
		vector<int> C;
		for(int i=0;i<10;i++){
			int nn;
			cin>>nn;
			A.push(nn);
		}
		C.push_back(0);
		for(int i=0;i<A.size();i++){
			if(i==0){
				B.push_back(A.front());
				A.pop();
				continue;
			}
			if(A.front()>B.back()){
				B.push_back(A.front());
				A.pop();
			}else if(A.front()>C.back()){
				C.push_back(A.front());
				A.pop();
			}else{
				cout<<"NO"<<endl;
				error=1;
				break;
			}
		}
		if(error==0)cout<<"YES"<<endl;
	}
	return 0;
}

C++: #include <iostream>
using namespace std;
int a[10];

bool func(int b,int c,int i){
	if (a[i]>b&&a[i]>c){
		if (b>c) {
			b=a[i];
		}
		else {
			c=a[i];
		}
	}
	else if(!(a[i]>b||a[i]>c)) {
		return false;
	}
	else {
		b>c?c=a[i]:b=a[i];
	}
	if (i==9) {
		return true;
	}
	if (func(b,c,i+1)) {
		return true;
	}
	return false;
}


		

int main () {
	int N;
	cin>>N;
	for (int i=0; i<N; i++) {
		for (int j=0; j<10; j++) {
			cin>>a[j];
		}
		if (func(0,0,0))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
		
	}
	
	
}

C++: #include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

// 2つのベクターに玉を振り分ける
// 振り分け方は以下のパターンを考える。
// 2つとも空
// 1つ目のベクターに詰める
// 1つが空
// 後に小さい数字の玉が続く場合は詰まっているほうにいれる
// 詰まっているほうに入らなければ結果はNO
// 両方に玉が入っている場合、
// より大きい玉が入っているほうを優先して詰めていく

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		int ball[10];
		for (int& a : ball) {
			cin >> a;
		}
		vector<int> vec[2];
		for (int a : ball) {
			// stk[0]が空のときは両方とも空
			if (vec[0].empty()) {
				vec[0].push_back(a);
			}
			else if (vec[1].empty()) {
				auto it = find_if((&a) + 1, end(ball), [a](int x) {return a > x;});
				if (it == end(ball)) {
					if (vec[0].back() < a) {
						vec[0].push_back(a);
					}
					else {
						// 後続に小さい球があり、詰まっているほうに入れられないのでNO
						break;
					}
				}
				else {
					// 後続に小さい球がない場合、空きに入れる。
					vec[1].push_back(a);
				}

			}
			else {
				if (a > vec[0].back() && a > vec[1].back()) {
					// どちらにも入れられる場合、大きいほうに入れる
					if (vec[0].back() > vec[1].back()) {
						vec[0].push_back(a);
					}
					else {
						vec[1].push_back(a);
					}
				}
				else if (a < vec[0].back() && a < vec[1].back()) {
					// 両方より大きい場合、結果はNO
					break;
				}
				else if (a > vec[0].back()) {
					vec[0].push_back(a);
				}
				else {
					vec[1].push_back(a);
				}
			}
		}
		if (vec[0].size() + vec[1].size() == 10) {
			cout << "YES" << endl;
		}
		else {
			cout << "NO" << endl;
		}
	}
	return 0;
}