Go: package main

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

var scanner = bufio.NewScanner(os.Stdin)

func nextInt() int {
	scanner.Scan()
	i, e := strconv.Atoi(scanner.Text())
	if e != nil {
		panic(e)
	}
	return i
}

func main() {
	scanner.Split(bufio.ScanWords)
	n := nextInt()
	for i := 0; i < n; i++ {
		a := -1
		b := -1
		ans := true
		// それぞれの筒の一番上にあるたまの数字に着目すればよい
		for j := 0; j < 10; j++ {
			x := nextInt()
			if x > a {
				a = x
			} else if x > b {
				b = x
			} else {
				ans = false
			}
		}
		if ans {
			fmt.Println("YES")
		} else {
			fmt.Println("NO")
		}
	}
}

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;
}

C++: #include <algorithm>
#include <cmath>
#include <climits>
#include <cstring>
#include <deque>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map> //pair is also included in this library
#include <queue>
#include <set>
#include <stack>
#include <string>
//#include <unordered_map>
#include <vector>

#define REP(i, s, n) for(int i = (int)(s); i < (int)(n); i++)
#define fst first
#define snd second
#define MP make_pair //incase c++11 or later is not available

using namespace std;

typedef long long int ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;

//prefer define statement
//for reason that const int ver. of INF will raise a silly warning (unused variable)
#define INF (INT_MAX/3)
#define LIM_INF (INT_MAX)
//const int INF = INT_MAX/3;

/*------------------------------------------------------------------------------*/

int main(){
  int P;
  scanf("%d\n", &P);
  VI tp(P);
  set<int> topics;
  REP(i, 0, P){
    scanf("%d ", &tp[i]);
    topics.insert(tp[i]);
  }

  int kinds = topics.size();
  map<int, int> sub;
  int num = 0;
  int lb = 0, ub = 0;
  int res = INF;

  sub[tp[0]]++;
  num++;

  while(lb < P){
    if(kinds > num){
      ub++;
      if(sub[tp[ub]] == 0){
        num++;
      }
      sub[tp[ub]]++;
    }
    if(num == kinds){
      res = min(INF, ub-lb+1);
    }
    if(kinds <= num){
      if(sub[tp[lb]] == 1){
        num--;
      }
      sub[tp[lb]]--;
      lb++;
    }
  }
  printf("%d\n", res);

  return 0;
}

C++: #include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <typeinfo>
#include <stdio.h>

using namespace std;

vector<int> ball(10);

int dfs(int cnt, int l, int r){ 
    ++cnt;
    if(cnt == 10) return 1;
    if(ball[cnt] > r){ 
        if(dfs(cnt,l,ball[cnt])) return 1;
    }   
    else if(ball[cnt] > l){ 
        if(dfs(cnt,ball[cnt],r)) return 1;
    }   
    return 0;
}
int main(int argc, void *argv[]){
    int n;
    int tmp;
    
    scanf("%d", &n);
    while(n--){
        for(int i=0;i<10;i++){
            scanf("%d",&tmp);
            ball[i] = tmp;
        }   
        if(dfs(-1,0,0)) printf("YES\n"); else printf("NO\n");
    }   
}