Problem p03014 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    new_data_set;

#define fast                                                                   \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);                                                                  \
  cout.tie(0)
#define PSET(x, y) fixed << setprecision(y) << x
#define pb push_back
#define pf push_front
#define mp make_pair
#define pii pair<int, int>
#define vi vector<int>
#define vip vector<pair<int, int>>
#define ff first
#define ss second
#define int long long
#define SIZE 200010
#define mod 1000000007
#define BIG 998244353
#define s(t) scanf("%d", &t)
#define p(t) printf("%d\n", t)
#define mii map<int, int>
#define MSET(table, i) memset(table, i, sizeof(table))
#define endl '\n'
#define tc                                                                     \
  int t;                                                                       \
  cin >> t;                                                                    \
  while (t--)
#define pi 3.1415926358
#define print(x)                                                               \
  for (auto el : x)                                                            \
    cout << el << " ";                                                         \
  cout << endl
#define bits(x) __builtin_popcount(x)
#define minimum(a, n) min_element(a, a + n) - a
#define maximum(a, n) max_element(a, a + n) - a
#define pqbig priority_queue<int>
#define pqsmall priority_queue<int, vector<int>, greater<int>>
#define all(v) v.begin(), v.end()
#define sitr set<int>::iterator
#define mitr map<int, int>::iterator

#define trace1(x) cerr << #x << ": " << x << endl
#define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl
#define trace3(x, y, z)                                                        \
  cerr << #x << ":" << x << " | " << #y << ": " << y << " | " << #z << ": "    \
       << z << endl
#define trace4(a, b, c, d)                                                     \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << endl
#define trace5(a, b, c, d, e)                                                  \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl
#define trace6(a, b, c, d, e, f)                                               \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | "   \
       << #f << ": " << f << endl

const int N = 1005;
int leftside[N][N];
int rightside[N][N];
int up[N][N];
int down[N][N];
char arr[N][N];
int n, m;

void fillleft() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (arr[i][j] == '.')
        leftside[i][j] = 1 + leftside[i][j - 1];
      else
        leftside[i][j] = 0;
    }
  }
}

void fillright() {
  for (int i = 1; i <= n; i++) {
    for (int j = m; j >= 1; j--) {
      if (arr[i][j] == '.')
        rightside[i][j] = 1 + rightside[i][j + 1];
      else
        rightside[i][j] = 0;
    }
  }
}
void fillup() {
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      if (arr[i][j] == '.')
        up[i][j] = 1 + up[i - 1][j];
      else
        up[i][j] = 0;
    }
  }
}
void filldown() {
  for (int j = 1; j <= m; j++) {
    for (int i = n; i >= 1; i--) {
      if (arr[i][j] == '.')
        down[i][j] = 1 + down[i + 1][j];
      else
        down[i][j] = 0;
    }
  }
}

int32_t main() {
  fast;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      cin >> arr[i][j];

  fillleft();
  fillright();
  fillup();
  filldown();
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (arr[i][j] == '#')
        continue;

      int l = leftside[i][j] - 1;
      int r = rightside[i][j] - 1;
      int u = up[i][j] - 1;
      int d = down[i][j] - 1;
      int val = l + r + u + d + 1;
      ans = max(ans, val);
    }
  }
  cout << ans;
}

Fixed submission:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    new_data_set;

#define fast                                                                   \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);                                                                  \
  cout.tie(0)
#define PSET(x, y) fixed << setprecision(y) << x
#define pb push_back
#define pf push_front
#define mp make_pair
#define pii pair<int, int>
#define vi vector<int>
#define vip vector<pair<int, int>>
#define ff first
#define ss second
#define int long long
#define SIZE 200010
#define mod 1000000007
#define BIG 998244353
#define s(t) scanf("%d", &t)
#define p(t) printf("%d\n", t)
#define mii map<int, int>
#define MSET(table, i) memset(table, i, sizeof(table))
#define endl '\n'
#define tc                                                                     \
  int t;                                                                       \
  cin >> t;                                                                    \
  while (t--)
#define pi 3.1415926358
#define print(x)                                                               \
  for (auto el : x)                                                            \
    cout << el << " ";                                                         \
  cout << endl
#define bits(x) __builtin_popcount(x)
#define minimum(a, n) min_element(a, a + n) - a
#define maximum(a, n) max_element(a, a + n) - a
#define pqbig priority_queue<int>
#define pqsmall priority_queue<int, vector<int>, greater<int>>
#define all(v) v.begin(), v.end()
#define sitr set<int>::iterator
#define mitr map<int, int>::iterator

#define trace1(x) cerr << #x << ": " << x << endl
#define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl
#define trace3(x, y, z)                                                        \
  cerr << #x << ":" << x << " | " << #y << ": " << y << " | " << #z << ": "    \
       << z << endl
#define trace4(a, b, c, d)                                                     \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << endl
#define trace5(a, b, c, d, e)                                                  \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl
#define trace6(a, b, c, d, e, f)                                               \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | "   \
       << #f << ": " << f << endl

const int N = 2005;
int leftside[N][N];
int rightside[N][N];
int up[N][N];
int down[N][N];
char arr[N][N];
int n, m;

void fillleft() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (arr[i][j] == '.')
        leftside[i][j] = 1 + leftside[i][j - 1];
      else
        leftside[i][j] = 0;
    }
  }
}

void fillright() {
  for (int i = 1; i <= n; i++) {
    for (int j = m; j >= 1; j--) {
      if (arr[i][j] == '.')
        rightside[i][j] = 1 + rightside[i][j + 1];
      else
        rightside[i][j] = 0;
    }
  }
}
void fillup() {
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++) {
      if (arr[i][j] == '.')
        up[i][j] = 1 + up[i - 1][j];
      else
        up[i][j] = 0;
    }
  }
}
void filldown() {
  for (int j = 1; j <= m; j++) {
    for (int i = n; i >= 1; i--) {
      if (arr[i][j] == '.')
        down[i][j] = 1 + down[i + 1][j];
      else
        down[i][j] = 0;
    }
  }
}

int32_t main() {
  fast;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      cin >> arr[i][j];

  fillleft();
  fillright();
  fillup();
  filldown();
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (arr[i][j] == '#')
        continue;

      int l = leftside[i][j] - 1;
      int r = rightside[i][j] - 1;
      int u = up[i][j] - 1;
      int d = down[i][j] - 1;
      int val = l + r + u + d + 1;
      ans = max(ans, val);
    }
  }
  cout << ans;
}