Problem p02641 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

#define fio                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);                                                               \
  cout.tie(NULL);
#define ll long long
#define ull unsigned long long
#define ld long double
#define endl "\n"
#define ff first
#define ss second
#define pi pair<ll, ll>
#define PI 3.141592653589793238462643383279502884L
#define mp make_pair
#define pb push_back
#define fall(i, a, b) for (int i = a; i < b; i++)
#define sz(x) (ll) x.size()
#define all(x) x.begin(), x.end()
#define ed cout << "ed";
ll MOD = 1e9 + 7;
ll MOD1 = 1e9 + 123;
ll MOD2 = 1e9 + 321;
// ll mod(ll a, ll m)
// {
//     if (a == 0)
//         return 0;
//     else
//         return (a % m + m) % m;
// }
// int mod(string num, int a)
// {

//     int res = 0;

//     for (int i = 0; i < num.length(); i++)
//         res = (res * 10 + (int)num[i] - '0') % a;

//     return res;
// }

// ll d, x, y;
// void extendedEuclid(int A, int B)
// {
//     if (B == 0)
//     {
//         d = A;
//         x = 1;
//         y = 0;
//     }
//     else
//     {
//         extendedEuclid(B, A % B);
//         int temp = x;
//         x = y;
//         y = temp - (A / B) * y;
//     }
// }

// ll modInverse(int A, int M)
// {
//     extendedEuclid(A, M);
//     return (x % M + M) % M;
// }

// // Generate random base in (before, after) open interval:
// int gen_base(const int before, const int after)
// {
//     auto seed =
//     std::chrono::high_resolution_clock::now().time_since_epoch().count();
//     std::mt19937 mt_rand(seed);
//     int base = std::uniform_int_distribution<int>(before + 1,
//     after)(mt_rand); return base % 2 == 0 ? base - 1 : base;
// }

ll poow(ll a, ll b, ll m) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0)
    return ((ll)poow((a % m) * (a % m), b / 2, m) % m);
  else
    return ((a % m) * ((ll)poow((a % m) * (a % m), b / 2, m) % m)) % m;
}
// vector<int> rabin_karp(string const &t, string const &s) //string ,pattern
// {
//     const ll p1 = gen_base(3597, MOD1);
//     const ll p2 = gen_base(3597, MOD2);
//     const ll m1 = MOD1;
//     const ll m2 = MOD2;
//     ll S = s.size(), T = t.size();
//     vector<long long> p_pow1(max(S, T)), p_pow2(max(S, T));
//     p_pow1[0] = 1;
//     p_pow2[0] = 1;
//     for (int i = 1; i < (int)p_pow1.size(); i++)
//     {
//         p_pow1[i] = (p_pow1[i - 1] * p1) % m1;
//         p_pow2[i] = (p_pow2[i - 1] * p2) % m2;
//     }

//     vector<long long> h1(T + 1, 0), h2(T + 1, 0);
//     for (int i = 0; i < T; i++)
//     {
//         h1[i + 1] = (h1[i] + (t[i]) * p_pow1[i]) % m1;
//         h2[i + 1] = (h2[i] + (t[i]) * p_pow2[i]) % m2;
//     }
//     long long h_s1 = 0, h_s2 = 0;
//     for (int i = 0; i < S; i++)
//     {
//         h_s1 = (h_s1 + (s[i]) * p_pow1[i]) % m1;
//         h_s2 = (h_s2 + (s[i]) * p_pow2[i]) % m2;
//     }

//     vector<int> occurences;
//     for (int i = 0; i + S - 1 < T; i++)
//     {
//         long long cur_h1 = (h1[i + S] + m1 - h1[i]) % m1;
//         long long cur_h2 = (h2[i + S] + m2 - h2[i]) % m2;
//         if (cur_h1 == h_s1 * p_pow1[i] % m1 && cur_h2 == h_s2 * p_pow2[i] %
//         m2)
//             occurences.push_back(i);
//     }
//     return occurences;
// }
// vector<int> Q;
// vector<int> G[1000000];
// vector<int> L(1000000, 0);
// vector<int> vis(1000000, 0);
// void dfs(ll y)
// {
//     vis[y] = 1;
//     Q.pb(y);
//     for (auto h : G[y])
//     {
//         if (vis[h] == 0)
//             dfs(h);
//     }
// }
// bool is_bipartite(ll y, ll d)
// {
//     vis[y] = true;
//     L[y] = d;
//     for (auto h : G[y])

//         if (vis[h] == false)
//             return is_bipartite(h, 1 ^ d);
//         else if (L[h] == d)
//             return false;
//     return true;
// }
bool compa(string a, string b) {
  if (a.length() <= b.length())
    return true;
  else
    return false;
}

int main() {
  fio;
  ll t, a, n, q, k, i, m, c, u, f, j, p, r, x, y, s, b, d;

  // Sieve
  //   p= 1000000;
  // bool a[p];

  //       for (i = 2; i <= p; i += 1)
  //          a[i] = true;
  //       a[0] = false;
  //       a[1] = false;

  //       for (i = 2; i * i <= p; i += 1)
  //       {
  //          if (a[i] == true)
  //             for (j = i * i; j <= p; j += i)
  //                a[j] = false;
  //       }

  cin >> n >> t;

  if (t == 0)
    cout << n;
  else {
    vector<ll> v;

    unordered_map<ll, ll> MA;
    for (i = 0; i < t; i++) {
      cin >> p;
      MA[p]++;
    }

    for (i = 0; i < 100; i++) {
      if (MA.find(i + 1) == MA.end())
        v.pb(i + 1);
    }

    a = 0;
    b = v.size() - 1;

    while (a <= b) {
      m = a + (b - a) / 2;
      if (v[m] == n)
        break;
      else if (v[m] < n)
        a = m + 1;
      else
        b = m - 1;
    }
    if (v[m] == n)
      cout << n;
    else if (b < 0)
      cout << v[a];
    else if (a >= 100)
      cout << v[b];
    else if (abs(v[a] - n) == abs(v[b] - n))
      cout << min(v[a], v[b]);
    else if (abs(v[a] - n) > abs(v[b] - n))
      cout << v[b];
    else
      cout << v[a];
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define fio                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);                                                               \
  cout.tie(NULL);
#define ll long long
#define ull unsigned long long
#define ld long double
#define endl "\n"
#define ff first
#define ss second
#define pi pair<ll, ll>
#define PI 3.141592653589793238462643383279502884L
#define mp make_pair
#define pb push_back
#define fall(i, a, b) for (int i = a; i < b; i++)
#define sz(x) (ll) x.size()
#define all(x) x.begin(), x.end()
#define ed cout << "ed";
ll MOD = 1e9 + 7;
ll MOD1 = 1e9 + 123;
ll MOD2 = 1e9 + 321;
// ll mod(ll a, ll m)
// {
//     if (a == 0)
//         return 0;
//     else
//         return (a % m + m) % m;
// }
// int mod(string num, int a)
// {

//     int res = 0;

//     for (int i = 0; i < num.length(); i++)
//         res = (res * 10 + (int)num[i] - '0') % a;

//     return res;
// }

// ll d, x, y;
// void extendedEuclid(int A, int B)
// {
//     if (B == 0)
//     {
//         d = A;
//         x = 1;
//         y = 0;
//     }
//     else
//     {
//         extendedEuclid(B, A % B);
//         int temp = x;
//         x = y;
//         y = temp - (A / B) * y;
//     }
// }

// ll modInverse(int A, int M)
// {
//     extendedEuclid(A, M);
//     return (x % M + M) % M;
// }

// // Generate random base in (before, after) open interval:
// int gen_base(const int before, const int after)
// {
//     auto seed =
//     std::chrono::high_resolution_clock::now().time_since_epoch().count();
//     std::mt19937 mt_rand(seed);
//     int base = std::uniform_int_distribution<int>(before + 1,
//     after)(mt_rand); return base % 2 == 0 ? base - 1 : base;
// }

ll poow(ll a, ll b, ll m) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0)
    return ((ll)poow((a % m) * (a % m), b / 2, m) % m);
  else
    return ((a % m) * ((ll)poow((a % m) * (a % m), b / 2, m) % m)) % m;
}
// vector<int> rabin_karp(string const &t, string const &s) //string ,pattern
// {
//     const ll p1 = gen_base(3597, MOD1);
//     const ll p2 = gen_base(3597, MOD2);
//     const ll m1 = MOD1;
//     const ll m2 = MOD2;
//     ll S = s.size(), T = t.size();
//     vector<long long> p_pow1(max(S, T)), p_pow2(max(S, T));
//     p_pow1[0] = 1;
//     p_pow2[0] = 1;
//     for (int i = 1; i < (int)p_pow1.size(); i++)
//     {
//         p_pow1[i] = (p_pow1[i - 1] * p1) % m1;
//         p_pow2[i] = (p_pow2[i - 1] * p2) % m2;
//     }

//     vector<long long> h1(T + 1, 0), h2(T + 1, 0);
//     for (int i = 0; i < T; i++)
//     {
//         h1[i + 1] = (h1[i] + (t[i]) * p_pow1[i]) % m1;
//         h2[i + 1] = (h2[i] + (t[i]) * p_pow2[i]) % m2;
//     }
//     long long h_s1 = 0, h_s2 = 0;
//     for (int i = 0; i < S; i++)
//     {
//         h_s1 = (h_s1 + (s[i]) * p_pow1[i]) % m1;
//         h_s2 = (h_s2 + (s[i]) * p_pow2[i]) % m2;
//     }

//     vector<int> occurences;
//     for (int i = 0; i + S - 1 < T; i++)
//     {
//         long long cur_h1 = (h1[i + S] + m1 - h1[i]) % m1;
//         long long cur_h2 = (h2[i + S] + m2 - h2[i]) % m2;
//         if (cur_h1 == h_s1 * p_pow1[i] % m1 && cur_h2 == h_s2 * p_pow2[i] %
//         m2)
//             occurences.push_back(i);
//     }
//     return occurences;
// }
// vector<int> Q;
// vector<int> G[1000000];
// vector<int> L(1000000, 0);
// vector<int> vis(1000000, 0);
// void dfs(ll y)
// {
//     vis[y] = 1;
//     Q.pb(y);
//     for (auto h : G[y])
//     {
//         if (vis[h] == 0)
//             dfs(h);
//     }
// }
// bool is_bipartite(ll y, ll d)
// {
//     vis[y] = true;
//     L[y] = d;
//     for (auto h : G[y])

//         if (vis[h] == false)
//             return is_bipartite(h, 1 ^ d);
//         else if (L[h] == d)
//             return false;
//     return true;
// }
bool compa(string a, string b) {
  if (a.length() <= b.length())
    return true;
  else
    return false;
}

int main() {
  fio;
  ll t, a, n, q, k, i, m, c, u, f, j, p, r, x, y, s, b, d;

  // Sieve
  //   p= 1000000;
  // bool a[p];

  //       for (i = 2; i <= p; i += 1)
  //          a[i] = true;
  //       a[0] = false;
  //       a[1] = false;

  //       for (i = 2; i * i <= p; i += 1)
  //       {
  //          if (a[i] == true)
  //             for (j = i * i; j <= p; j += i)
  //                a[j] = false;
  //       }

  cin >> n >> t;

  if (t == 0)
    cout << n;
  else {
    vector<ll> v;

    unordered_map<ll, ll> MA;
    for (i = 0; i < t; i++) {
      cin >> p;
      MA[p]++;
    }

    for (i = 0; i < 102; i++) {
      if (MA.find(i) == MA.end())
        v.pb(i);
    }

    a = 0;
    b = v.size() - 1;

    while (a <= b) {
      m = a + (b - a) / 2;
      if (v[m] == n)
        break;
      else if (v[m] < n)
        a = m + 1;
      else
        b = m - 1;
    }
    if (v[m] == n)
      cout << n;
    else if (b < 0)
      cout << v[a];
    else if (a >= 100)
      cout << v[b];
    else if (abs(v[a] - n) == abs(v[b] - n))
      cout << min(v[a], v[b]);
    else if (abs(v[a] - n) > abs(v[b] - n))
      cout << v[b];
    else
      cout << v[a];
  }
  return 0;
}