Problem p02268 (C++)

Buggy submission (status: Runtime Error):
#include <iostream>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
// 常に心してかかれ
// 簡単なことを簡単にできるように練習する
int main() {
  int n;
  int q;
  int tmp;
  int C = 0;
  int num_to_check;
  int S[10001];
  int head;
  int tail;
  int mid; // 中央値
  stack<int> T;

  cin >> n;

  for (int i = 0; i < n; i++) {
    scanf("%d", &S[i]);
  }

  /*確認
  for(int i=0;i<n;i++){
          cout <<S[i] <<" ";
  }
  cout <<endl;
  */

  cin >> q;

  for (int i = 0; i < q; i++) {
    scanf("%d", &tmp);
    T.push(tmp);
  }

  /*確認
  while(!T.empty()){
          cout <<T.top() <<" ";
          T.pop();
  }
  cout <<endl;
  */

  // 高速化用コード
  int j = 1;
  for (int i = 1; i < n; i++) {
    if (S[i] == S[i - 1]) {
      ;
    } else {
      j++;
      S[j] = S[i];
    }
  }
  n = j + 1;
  //

  while (!T.empty()) {
    num_to_check = T.top();
    T.pop();
    head = 0;
    tail = n - 1;

    // キーの探索
    while (head <= tail) {

      // 高速化用コード
      if (num_to_check < S[0] || num_to_check > S[n - 1])
        break;
      //

      if (head == tail) {
        if (num_to_check == S[head /*==tail*/]) {
          C++;
          break;
        } else {
          break;
        }
      }
      mid = (head + tail) / 2;
      if (num_to_check == S[mid]) { // 見つかった(中央の値と一致)
        C++;
        break;
      } else { // 中央の値と一致しない
        if (head == tail - 1) {
          if (num_to_check == S[head] || num_to_check == S[tail]) {
            C++;
            break;
          } else {
            break;
          }
        }
        if (num_to_check > S[mid]) { // 中央の値より大きい
          head = mid + 1;
          // cout <<"head" <<head <<"tail" <<tail <<endl;
        } else { // 中央の値より小さい
          tail = mid - 1;
          // cout <<"head" <<head <<"tail" <<tail <<endl;
        }
      }
    }
  }
  cout << C << endl;
  return 0;
}

Fixed submission:
#include <iostream>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
// 常に心してかかれ
// 簡単なことを簡単にできるように練習する
int main() {
  int n;
  int q;
  int tmp;
  int C = 0;
  int num_to_check;
  int S[100001];
  int head;
  int tail;
  int mid; // 中央値
  stack<int> T;

  cin >> n;

  for (int i = 0; i < n; i++) {
    scanf("%d", &S[i]);
  }

  /*確認
  for(int i=0;i<n;i++){
          cout <<S[i] <<" ";
  }
  cout <<endl;
  */

  cin >> q;

  for (int i = 0; i < q; i++) {
    scanf("%d", &tmp);
    T.push(tmp);
  }

  /*確認
  while(!T.empty()){
          cout <<T.top() <<" ";
          T.pop();
  }
  cout <<endl;
  */

  // 高速化用コード
  int j = 1;
  for (int i = 1; i < n; i++) {
    if (S[i] == S[i - 1]) {
      ;
    } else {
      j++;
      S[j] = S[i];
    }
  }
  n = j + 1;
  //

  while (!T.empty()) {
    num_to_check = T.top();
    T.pop();
    head = 0;
    tail = n - 1;

    // キーの探索
    while (head <= tail) {

      // 高速化用コード
      if (num_to_check < S[0] || num_to_check > S[n - 1])
        break;
      //

      if (head == tail) {
        if (num_to_check == S[head /*==tail*/]) {
          C++;
          break;
        } else {
          break;
        }
      }
      mid = (head + tail) / 2;
      if (num_to_check == S[mid]) { // 見つかった(中央の値と一致)
        C++;
        break;
      } else { // 中央の値と一致しない
        if (head == tail - 1) {
          if (num_to_check == S[head] || num_to_check == S[tail]) {
            C++;
            break;
          } else {
            break;
          }
        }
        if (num_to_check > S[mid]) { // 中央の値より大きい
          head = mid + 1;
          // cout <<"head" <<head <<"tail" <<tail <<endl;
        } else { // 中央の値より小さい
          tail = mid - 1;
          // cout <<"head" <<head <<"tail" <<tail <<endl;
        }
      }
    }
  }
  cout << C << endl;
  return 0;
}