Problem p03470 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm> // std::copy()
#include <cctype>    // std::isdigit()
#include <climits>   // INT_MIN
#include <cmath>
#include <cstdio>
#include <functional> // std::greater<T>()
#include <iostream>
#include <iterator> // std::back_inserter()
#include <numeric>  // accumulate(ALL(vec), 0)  0 は初期値
#include <set>
#include <string>
#include <utility> // std::swap()
#include <vector>
using namespace std;

#define ALL(obj) (obj).begin(), (obj).end()
#define REP(i, n) for (int i = 0; i < (int)(n); i++)   // 0 ~ n-1
#define REPN(i, n) for (int i = 1; i <= (int)(n); i++) // 1 ~ n
#define MIN(vec)                                                               \
  min_element(                                                                 \
      ALL((vec))) // イテレータのため、値を取り出すときは * を先頭につける
#define MAX(vec) max_element(ALL((vec)))
#define IDX(vec, element_iter) distance((vec).begin(), element_iter)
#define SUM(vec) accumulate(ALL((vec)), 0) // 0 は初期値
#define COPY(vec1, vec2)                                                       \
  copy(ALL(vec1),                                                              \
       back_inserter(                                                          \
           vec2)) // vec1をvec2にコピーする vec2は空にしておく必要あり
typedef long long ll;

const int MOD = 1000000007; // 1 000 000 007

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  // input
  int N, M;
  cin >> N >> M;
  const int NUM = 110;
  int vec[NUM], num[NUM] = {};
  REP(i, N) cin >> vec[i];

  // calculation
  REP(i, N) { num[vec[i]]++; }

  int sum = 0;
  REP(i, NUM) {
    if (num[i] != 0) {
      sum++;
    }
  }

  cout << sum << "\n";

  return 0;
}


Fixed submission:
#include <algorithm> // std::copy()
#include <cctype>    // std::isdigit()
#include <climits>   // INT_MIN
#include <cmath>
#include <cstdio>
#include <functional> // std::greater<T>()
#include <iostream>
#include <iterator> // std::back_inserter()
#include <numeric>  // accumulate(ALL(vec), 0)  0 は初期値
#include <set>
#include <string>
#include <utility> // std::swap()
#include <vector>
using namespace std;

#define ALL(obj) (obj).begin(), (obj).end()
#define REP(i, n) for (int i = 0; i < (int)(n); i++)   // 0 ~ n-1
#define REPN(i, n) for (int i = 1; i <= (int)(n); i++) // 1 ~ n
#define MIN(vec)                                                               \
  min_element(                                                                 \
      ALL((vec))) // イテレータのため、値を取り出すときは * を先頭につける
#define MAX(vec) max_element(ALL((vec)))
#define IDX(vec, element_iter) distance((vec).begin(), element_iter)
#define SUM(vec) accumulate(ALL((vec)), 0) // 0 は初期値
#define COPY(vec1, vec2)                                                       \
  copy(ALL(vec1),                                                              \
       back_inserter(                                                          \
           vec2)) // vec1をvec2にコピーする vec2は空にしておく必要あり
typedef long long ll;

const int MOD = 1000000007; // 1 000 000 007

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  // input
  int N;
  cin >> N;
  const int NUM = 110;
  int vec[NUM], num[NUM] = {};
  REP(i, N) cin >> vec[i];

  // calculation
  REP(i, N) { num[vec[i]]++; }

  int sum = 0;
  REP(i, NUM) {
    if (num[i] != 0) {
      sum++;
    }
  }

  cout << sum << "\n";

  return 0;
}