Problem p03014 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_int.hpp>
using namespace std;
// using namespace boost::multiprecision;
typedef long long int ll;
typedef long double ld;
#define MOD 1000000007
#define ALL(obj) (obj).begin(), (obj).end()
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long INF = 1LL << 60;
bool pairCompare(const pair<double, ll> &firstElof,
                 const pair<double, ll> &secondElof) {
  return firstElof.first < secondElof.first;
}
bool pairCompareSecond(const pair<double, ll> &firstElof,
                       const pair<double, ll> &secondElof) {
  return firstElof.second < secondElof.second;
}
// 四方向への移動ベクトル
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

struct edge { // グラフに使うヤツ
  ll from, to, cost;
};

typedef vector<vector<edge>> G;
ll gcd(ll a, ll b) {
  if (a % b == 0)
    return (b);
  else
    return (gcd(b, a % b));
}

int main() {
  ll h, w;
  cin >> h >> w;
  string s[h];
  for (ll i = 0; i < h; i++)
    cin >> s[i];
  ll tate[h][w], yoko[h][w];
  memset(tate, 0, sizeof(tate));
  memset(yoko, 0, sizeof(yoko));
  for (ll i = 0; i < h; i++) {
    ll c = 0;
    for (ll j = 0; j < w; j++) {
      if (s[i][j] == '#') {
        yoko[i][j] = 0;
        if (c != 0) {
          ll x = j - 1;
          while (s[i][x] == '.' and x >= 0) {
            yoko[i][x] = c;
            x--;
          }
          c = 0;
        }
      } else {
        c++;
      }
    }
    if (c) {
      ll x = w - 1;
      while (x >= 0 and s[i][x] == '.') {
        yoko[i][x] = c;
        x--;
      }
    }
  }
  for (ll i = 0; i < w; i++) {
    ll c = 0;
    for (ll j = 0; j < h; j++) {
      if (s[j][i] == '#') {
        tate[j][i] = 0;
        if (c != 0) {
          ll x = j - 1;
          while (x >= 0 and s[x][i] == '.') {
            tate[x][i] = c;
            x--;
          }
          c = 0;
        }
      } else {
        c++;
      }
    }
    if (c) {
      ll x = h - 1;
      while (s[x][i] == '.' and x >= 0) {
        tate[x][i] = c;
        x--;
      }
    }
  }
  ll ans = 0;
  for (ll i = 0; i < h; i++) {
    for (ll j = 0; j < w; j++) {
      ans = max(ans, tate[i][j] + yoko[i][j]);
    }
  }
  cout << ans - 1 << endl;
  return 0;
}


Fixed submission:
#include <iostream>
// #include <boost/multiprecision/cpp_int.hpp>
using namespace std;
// using namespace boost::multiprecision;
typedef long long int ll;
typedef long double ld;
#define MOD 1000000007
#define ALL(obj) (obj).begin(), (obj).end()
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long INF = 1LL << 60;
bool pairCompare(const pair<double, ll> &firstElof,
                 const pair<double, ll> &secondElof) {
  return firstElof.first < secondElof.first;
}
bool pairCompareSecond(const pair<double, ll> &firstElof,
                       const pair<double, ll> &secondElof) {
  return firstElof.second < secondElof.second;
}
// 四方向への移動ベクトル
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

struct edge { // グラフに使うヤツ
  ll from, to, cost;
};

typedef vector<vector<edge>> G;
ll gcd(ll a, ll b) {
  if (a % b == 0)
    return (b);
  else
    return (gcd(b, a % b));
}

int main() {
  ll h, w;
  cin >> h >> w;
  string s[h];
  for (ll i = 0; i < h; i++)
    cin >> s[i];
  ll tate[h][w], yoko[h][w];
  memset(tate, 0, sizeof(tate));
  memset(yoko, 0, sizeof(yoko));
  for (ll i = 0; i < h; i++) {
    ll c = 0;
    for (ll j = 0; j < w; j++) {
      if (s[i][j] == '#') {
        yoko[i][j] = 0;
        if (c != 0) {
          ll x = j - 1;
          while (s[i][x] == '.' and x >= 0) {
            yoko[i][x] = c;
            x--;
          }
          c = 0;
        }
      } else {
        c++;
      }
    }
    if (c) {
      ll x = w - 1;
      while (x >= 0 and s[i][x] == '.') {
        yoko[i][x] = c;
        x--;
      }
    }
  }
  for (ll i = 0; i < w; i++) {
    ll c = 0;
    for (ll j = 0; j < h; j++) {
      if (s[j][i] == '#') {
        tate[j][i] = 0;
        if (c != 0) {
          ll x = j - 1;
          while (x >= 0 and s[x][i] == '.') {
            tate[x][i] = c;
            x--;
          }
          c = 0;
        }
      } else {
        c++;
      }
    }
    if (c) {
      ll x = h - 1;
      while (s[x][i] == '.' and x >= 0) {
        tate[x][i] = c;
        x--;
      }
    }
  }
  ll ans = 0;
  for (ll i = 0; i < h; i++) {
    for (ll j = 0; j < w; j++) {
      ans = max(ans, tate[i][j] + yoko[i][j]);
    }
  }
  cout << ans - 1 << endl;
  return 0;
}