Problem p03651 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <complex>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <limits>
#include <locale>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <time.h>
#include <type_traits>
#include <vector>

using namespace std;
#define SAY_YES cout << "YES" << endl;
#define SAY_Yes cout << "Yes" << endl;
#define SAY_NO cout << "NO" << endl;
#define SAY_No cout << "No" << endl;
#define IFYES(TRUE_OR_FALSE)                                                   \
  if (TRUE_OR_FALSE) {                                                         \
    cout << "YES" << endl;                                                     \
  } else {                                                                     \
    cout << "NO" << endl;                                                      \
  }
#define IFYes(TRUE_OR_FALSE)                                                   \
  if (TRUE_OR_FALSE) {                                                         \
    cout << "Yes" << endl;                                                     \
  } else {                                                                     \
    cout << "No" << endl;                                                      \
  }
#define IFyes(TRUE_OR_FALSE)                                                   \
  if (TRUE_OR_FALSE) {                                                         \
    cout << "yes" << endl;                                                     \
  } else {                                                                     \
    cout << "no" << endl;                                                      \
  }
#define DEBUG_OUTPUT_ARRAY(XXX, ONE)                                           \
  for (int i = 0; i < (ONE); i++) {                                            \
    cout << "DEBUG: i = " << i << " -> " << XXX[i] << endl;                    \
  }
#define DEBUG_OUTPUT_ARRAY2(XXX, ONE, TWO)                                     \
  for (int i = 0; i < (ONE); i++) {                                            \
    cout << "<<< i = " << i << " >>>" << endl;                                 \
    for (int j = 0; j < (TWO); j++) {                                          \
      cout << "DEBUG: j = " << j << " -> " << XXX[i][j] << endl;               \
    }                                                                          \
  }
#define DEBUG_OUTPUT_ARRAY2_BOX(XXX, ONE, TWO)                                 \
  for (int i = 0; i < (ONE); i++) {                                            \
    cout << i << "  ";                                                         \
    for (int j = 0; j < (TWO); j++) {                                          \
      cout << XXX[i][j] << " ";                                                \
    }                                                                          \
    cout << endl;                                                              \
  }

typedef pair<long long int, long long int> pll;

const long long int mod = 1000000007;
const long long int INF = 1e18;
const long double PI = 3.14159265358979323;

long long int N, K, A[200200], B, C, L[234567] = {}, R[234567] = {};
vector<long long int> pl, mi;

// ユークリッドの互除法　a,bは最大公約数を求めたい２つの数
class Euclid_Gojyohou {
public:
  long long int gcd(long long int a, long long int b) {
    if (a == 0) {
      return b;
    }
    if (b == 0) {
      return a;
    }
    long long int tmp;
    long long int r = 1;
    if (b > a) {
      tmp = a;
      a = b;
      b = tmp;
    }
    r = a % b;
    while (r != 0) {

      a = b;
      b = r;
      r = a % b;
    }
    return b;
  }
};

int main() {
  cout << fixed << setprecision(18);
  cin >> N >> K;
  Euclid_Gojyohou EUC;
  for (long long int i = 1; i <= N; i++) {
    cin >> A[i];
    L[i] = EUC.gcd(L[i - 1], A[i]);
  }
  for (long long int i = N; i >= 1; i--) {
    R[i] = EUC.gcd(R[i + 1], A[i]);
  }
  for (long long int i = 1; i <= N; i++) {
    if (A[i] < K) {
      continue;
    }
    if ((A[i] - K) % EUC.gcd(L[i - 1], R[i + 1]) == 0) {
      cout << "POSSIBLE" << endl;
      return 0;
    }
  }
  cout << "IMPOSSIBLE" << endl;
}

Fixed submission:
#include <algorithm>
#include <complex>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <limits>
#include <locale>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <time.h>
#include <type_traits>
#include <vector>

using namespace std;
#define SAY_YES cout << "YES" << endl;
#define SAY_Yes cout << "Yes" << endl;
#define SAY_NO cout << "NO" << endl;
#define SAY_No cout << "No" << endl;
#define IFYES(TRUE_OR_FALSE)                                                   \
  if (TRUE_OR_FALSE) {                                                         \
    cout << "YES" << endl;                                                     \
  } else {                                                                     \
    cout << "NO" << endl;                                                      \
  }
#define IFYes(TRUE_OR_FALSE)                                                   \
  if (TRUE_OR_FALSE) {                                                         \
    cout << "Yes" << endl;                                                     \
  } else {                                                                     \
    cout << "No" << endl;                                                      \
  }
#define IFyes(TRUE_OR_FALSE)                                                   \
  if (TRUE_OR_FALSE) {                                                         \
    cout << "yes" << endl;                                                     \
  } else {                                                                     \
    cout << "no" << endl;                                                      \
  }
#define DEBUG_OUTPUT_ARRAY(XXX, ONE)                                           \
  for (int i = 0; i < (ONE); i++) {                                            \
    cout << "DEBUG: i = " << i << " -> " << XXX[i] << endl;                    \
  }
#define DEBUG_OUTPUT_ARRAY2(XXX, ONE, TWO)                                     \
  for (int i = 0; i < (ONE); i++) {                                            \
    cout << "<<< i = " << i << " >>>" << endl;                                 \
    for (int j = 0; j < (TWO); j++) {                                          \
      cout << "DEBUG: j = " << j << " -> " << XXX[i][j] << endl;               \
    }                                                                          \
  }
#define DEBUG_OUTPUT_ARRAY2_BOX(XXX, ONE, TWO)                                 \
  for (int i = 0; i < (ONE); i++) {                                            \
    cout << i << "  ";                                                         \
    for (int j = 0; j < (TWO); j++) {                                          \
      cout << XXX[i][j] << " ";                                                \
    }                                                                          \
    cout << endl;                                                              \
  }

typedef pair<long long int, long long int> pll;

const long long int mod = 1000000007;
const long long int INF = 1e18;
const long double PI = 3.14159265358979323;

long long int N, K, A[200200], B, C, L[234567] = {}, R[234567] = {};
vector<long long int> pl, mi;

// ユークリッドの互除法　a,bは最大公約数を求めたい２つの数
class Euclid_Gojyohou {
public:
  long long int gcd(long long int a, long long int b) {
    if (a == 0) {
      return b;
    }
    if (b == 0) {
      return a;
    }
    long long int tmp;
    long long int r = 1;
    if (b > a) {
      tmp = a;
      a = b;
      b = tmp;
    }
    r = a % b;
    while (r != 0) {

      a = b;
      b = r;
      r = a % b;
    }
    return b;
  }
};

int main() {
  cout << fixed << setprecision(18);
  cin >> N >> K;
  Euclid_Gojyohou EUC;
  for (long long int i = 1; i <= N; i++) {
    cin >> A[i];
    L[i] = EUC.gcd(L[i - 1], A[i]);
  }
  if (N == 1 && K == A[1]) {
    cout << "POSSIBLE" << endl;
    return 0;
  }
  if (N == 1 && K != A[1]) {
    cout << "IMPOSSIBLE" << endl;
    return 0;
  }
  for (long long int i = N; i >= 1; i--) {
    R[i] = EUC.gcd(R[i + 1], A[i]);
  }
  for (long long int i = 1; i <= N; i++) {
    if (A[i] < K) {
      continue;
    }
    if ((A[i] - K) % EUC.gcd(L[i - 1], R[i + 1]) == 0) {
      cout << "POSSIBLE" << endl;
      return 0;
    }
  }
  cout << "IMPOSSIBLE" << endl;
}