Problem p03167 (C++)

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

#define ll long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
#define loop(i, a, b) for (ll i = a; i < b; i++)
#define initialize(array, size, value)                                         \
  for (ll i = 0; i < size; i++)                                                \
  array[i] = value
#define couta(array, size)                                                     \
  for (ll i = 0; i < size; i++)                                                \
  cout << array[i] << " "
#define debug(x) cout << "x: " << x << endl
#define dbug(x, y)                                                             \
  cout << "x: " << x << "    "                                                 \
       << "y: " << y << endl
#define inf (long long int)1e18
#define eps 0.000001
#define vl vector<ll>
#define sl set<ll>
#define pll pair<ll, ll>
#define mll map<ll, ll>
#define pq priority_queue<ll>
#define mod 1000000007
#define MAXN 1000001
ll spf[MAXN];
ll gcd(ll a, ll b);
ll palindrome(string s);
ll modexp(ll a, ll b, ll m);
void sieve();
ll ceil(ll a, ll b);
vl getFactorization(ll x);
void getZarr(string str, ll Z[]);
vector<ll> prefix_function(string s);

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
#ifndef ONLINE_JUDGE
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif

  ll h, w;
  cin >> h >> w;
  char a[h + 1][w + 1];
  for (ll i = 1; i <= h; i++) {
    for (ll j = 1; j <= w; j++) {
      cin >> a[i][j];
    }
  }
  ll dp[h + 1][w + 1];
  dp[1][1] = 1;
  for (ll i = 1; i <= h; i++) {
    for (ll j = 1; j <= w; j++) {
      if (a[i][j] == '#')
        dp[i][j] = 0;
    }
  }
  for (ll i = 2; i <= w; i++) {
    if (a[1][i] == '.')
      dp[1][i] = dp[1][i - 1];
  }
  for (ll i = 2; i <= h; i++) {
    if (a[i][1] == '.')
      dp[i][1] = dp[i - 1][1];
  }
  for (ll i = 2; i <= h; i++) {
    for (ll j = 2; j <= w; j++) {
      if (a[i][j] == '.')
        dp[i][j] = (dp[i - 1][j] % mod + dp[i][j - 1] % mod) % mod;
    }
  }
  cout << dp[h][w] % mod << endl;
}

ll gcd(ll a, ll b) {
  if (a == 0)
    return b;
  if (b == 0)
    return a;
  if (a == b)
    return a;
  if (a > b)
    return gcd(a % b, b);
  return gcd(a, b % a);
}

ll palindrome(string s) {
  ll l = 0;
  ll h = s.length() - 1;
  while (h > l) {
    if (s[l++] != s[h--]) {
      return 0;
    }
  }
  return 1;
}

ll modexp(ll a, ll b, ll m) {
  if (b == 0)
    return 1;
  ll temp = modexp(a, b / 2, m);
  temp = (temp * temp) % m;
  if (b & 1)
    return (temp * (a % m)) % m; // if b is odd a^b = a^(b/2)*a^(b/2)*a
  return temp;
}

void sieve() {
  spf[1] = 1;
  for (ll i = 2; i < MAXN; i++)
    spf[i] = i;
  for (ll i = 4; i < MAXN; i += 2)
    spf[i] = 2;

  for (ll i = 3; i * i < MAXN; i++) {
    if (spf[i] == i) {
      for (ll j = i * i; j < MAXN; j += i)
        if (spf[j] == j)
          spf[j] = i;
    }
  }
}

vl getFactorization(ll x) {
  vl ret;
  while (x != 1) {
    ret.push_back(spf[x]);
    x = x / spf[x];
  }
  return ret;
}

ll ceil(ll a, ll b) { return a / b + (a % b != 0); }

void getZarr(string str, ll Z[]) {
  ll n = str.length();
  ll L, R, k;
  L = R = 0;
  for (ll i = 1; i < n; ++i) {
    if (i > R) {
      L = R = i;
      while (R < n && str[R - L] == str[R])
        R++;
      Z[i] = R - L;
      R--;
    } else {
      k = i - L;
      if (Z[k] < R - i + 1)
        Z[i] = Z[k];
      else {
        L = i;
        while (R < n && str[R - L] == str[R])
          R++;
        Z[i] = R - L;
        R--;
      }
    }
  }
}

vector<ll> prefix_function(string s) {
  ll n = (ll)s.length();
  vector<ll> pi(n);
  for (ll i = 1; i < n; i++) {
    ll j = pi[i - 1];
    while (j > 0 && s[i] != s[j])
      j = pi[j - 1];
    if (s[i] == s[j])
      j++;
    pi[i] = j;
  }
  return pi;
}

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

#define ll long long
#define ld long double
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define lb lower_bound
#define ub upper_bound
#define loop(i, a, b) for (ll i = a; i < b; i++)
#define initialize(array, size, value)                                         \
  for (ll i = 0; i < size; i++)                                                \
  array[i] = value
#define couta(array, size)                                                     \
  for (ll i = 0; i < size; i++)                                                \
  cout << array[i] << " "
#define debug(x) cout << "x: " << x << endl
#define dbug(x, y)                                                             \
  cout << "x: " << x << "    "                                                 \
       << "y: " << y << endl
#define inf (long long int)1e18
#define eps 0.000001
#define vl vector<ll>
#define sl set<ll>
#define pll pair<ll, ll>
#define mll map<ll, ll>
#define pq priority_queue<ll>
#define mod 1000000007
#define MAXN 1000001
ll spf[MAXN];
ll gcd(ll a, ll b);
ll palindrome(string s);
ll modexp(ll a, ll b, ll m);
void sieve();
ll ceil(ll a, ll b);
vl getFactorization(ll x);
void getZarr(string str, ll Z[]);
vector<ll> prefix_function(string s);

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  /*#ifndef ONLINE_JUDGE
      freopen("input.txt", "r", stdin);
      freopen("output.txt", "w", stdout);
  #endif*/

  ll h, w;
  cin >> h >> w;
  char a[h + 1][w + 1];
  for (ll i = 1; i <= h; i++) {
    for (ll j = 1; j <= w; j++) {
      cin >> a[i][j];
    }
  }
  ll dp[h + 1][w + 1];
  dp[1][1] = 1;
  for (ll i = 1; i <= h; i++) {
    for (ll j = 1; j <= w; j++) {
      if (a[i][j] == '#')
        dp[i][j] = 0;
    }
  }
  for (ll i = 2; i <= w; i++) {
    if (a[1][i] == '.')
      dp[1][i] = dp[1][i - 1];
  }
  for (ll i = 2; i <= h; i++) {
    if (a[i][1] == '.')
      dp[i][1] = dp[i - 1][1];
  }
  for (ll i = 2; i <= h; i++) {
    for (ll j = 2; j <= w; j++) {
      if (a[i][j] == '.')
        dp[i][j] = (dp[i - 1][j] % mod + dp[i][j - 1] % mod) % mod;
    }
  }
  cout << dp[h][w] % mod << endl;
}

ll gcd(ll a, ll b) {
  if (a == 0)
    return b;
  if (b == 0)
    return a;
  if (a == b)
    return a;
  if (a > b)
    return gcd(a % b, b);
  return gcd(a, b % a);
}

ll palindrome(string s) {
  ll l = 0;
  ll h = s.length() - 1;
  while (h > l) {
    if (s[l++] != s[h--]) {
      return 0;
    }
  }
  return 1;
}

ll modexp(ll a, ll b, ll m) {
  if (b == 0)
    return 1;
  ll temp = modexp(a, b / 2, m);
  temp = (temp * temp) % m;
  if (b & 1)
    return (temp * (a % m)) % m; // if b is odd a^b = a^(b/2)*a^(b/2)*a
  return temp;
}

void sieve() {
  spf[1] = 1;
  for (ll i = 2; i < MAXN; i++)
    spf[i] = i;
  for (ll i = 4; i < MAXN; i += 2)
    spf[i] = 2;

  for (ll i = 3; i * i < MAXN; i++) {
    if (spf[i] == i) {
      for (ll j = i * i; j < MAXN; j += i)
        if (spf[j] == j)
          spf[j] = i;
    }
  }
}

vl getFactorization(ll x) {
  vl ret;
  while (x != 1) {
    ret.push_back(spf[x]);
    x = x / spf[x];
  }
  return ret;
}

ll ceil(ll a, ll b) { return a / b + (a % b != 0); }

void getZarr(string str, ll Z[]) {
  ll n = str.length();
  ll L, R, k;
  L = R = 0;
  for (ll i = 1; i < n; ++i) {
    if (i > R) {
      L = R = i;
      while (R < n && str[R - L] == str[R])
        R++;
      Z[i] = R - L;
      R--;
    } else {
      k = i - L;
      if (Z[k] < R - i + 1)
        Z[i] = Z[k];
      else {
        L = i;
        while (R < n && str[R - L] == str[R])
          R++;
        Z[i] = R - L;
        R--;
      }
    }
  }
}

vector<ll> prefix_function(string s) {
  ll n = (ll)s.length();
  vector<ll> pi(n);
  for (ll i = 1; i < n; i++) {
    ll j = pi[i - 1];
    while (j > 0 && s[i] != s[j])
      j = pi[j - 1];
    if (s[i] == s[j])
      j++;
    pi[i] = j;
  }
  return pi;
}