Problem p02855 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <cmath>
#include <numeric>
using namespace std;
#define rep(i, a, b) for (int64_t i = (a); i < (b); ++i) // a ≦ i < b
#define Rrep(i, a, b)                                                          \
  for (int64_t i = (a); i >= (b); --i) // reverse repeat. a から b まで減少．
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend() // 逆イテレータ
#define RANGE(a, b, c)                                                         \
  (a).begin() + b, (a).begin() + c // コンテナ a の 要素 b から c へのイテレータ
#define MOD 1000000007
#define INF 1000000000
typedef pair<int64_t, int64_t> PII;
typedef vector<int64_t> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef vector<PII> VP;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int H, W, K;
  cin >> H >> W >> K;
  VS s(H);
  rep(i, 0, H) cin >> s[i];

  string dotsline(W, '.');
  VVI ans(H, VI(W, -1));
  int n = 1;
  rep(i, 0, H) {
    if (s[i] != dotsline) {
      rep(j, 0, W) {
        if (s[i][j] == '#') {
          ans[i][j] = n;
          ++n;
        } else {
          ans[i][j] = n;
        }
      }
      if (s[i][W - 1] == '.') {
        --n;
        for (int j = W - 1; s[i][j] == '.'; --j)
          ans[i][j] = n;
        ++n;
      }
    }
  }
  rep(i, 0, H - 1) {
    if (s[i] == dotsline) {
      int k = i;
      while (k < H && ans[k][0] == -1)
        ++k;
      if (k > H)
        continue;
      rep(j, 0, W) cout << ans[k][j] << ' ';
      cout << "\n";
    } else {
      rep(j, 0, W) cout << ans[i][j] << ' ';
      cout << "\n";
    }
  }
  if (s[H - 1] == dotsline) {
    int k = H - 1;
    while (ans[k][0] == -1)
      --k;
    rep(i, k + 1, H) rep(j, 0, W) cout << ans[k][j] << ' ';
  } else
    rep(i, 0, W) cout << ans[H - 1][i] << ' ';
}

// 境界，出力文字列 チェック
// 可読性優先．高速化次点．
// まずは全探索，分割統治，次にDP
// 制限を見る
// 偶奇，逆から，ソート，出現回数，出現位置，DP， 余事象，包除
// データ構造． 問題の特徴量．単調性，二分探索
// 存在判定：構成方法，入力の特徴
// gcd, lcm ,素因数分解．
// 例外を十分に含む一般化．想像力の限界
// 小さい系から例示
// 始めは過剰に例示・場合分けしてもいい．各場合を確実に対処．
// 自明な例から処理，除外．
// 小数のときは，精度の設定する．doubel 変数に数値を入力するときは 123. とする．
// テストケース作成は数表あり


Fixed submission:
#include <bits/stdc++.h>
#include <cmath>
#include <numeric>
using namespace std;
#define rep(i, a, b) for (int64_t i = (a); i < (b); ++i) // a ≦ i < b
#define Rrep(i, a, b)                                                          \
  for (int64_t i = (a); i >= (b); --i) // reverse repeat. a から b まで減少．
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend() // 逆イテレータ
#define RANGE(a, b, c)                                                         \
  (a).begin() + b, (a).begin() + c // コンテナ a の 要素 b から c へのイテレータ
#define MOD 1000000007
#define INF 1000000000
typedef pair<int64_t, int64_t> PII;
typedef vector<int64_t> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef vector<PII> VP;

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int H, W, K;
  cin >> H >> W >> K;
  VS s(H);
  rep(i, 0, H) cin >> s[i];

  string dotsline(W, '.');
  VVI ans(H, VI(W, -1));
  int n = 1;
  rep(i, 0, H) {
    if (s[i] != dotsline) {
      rep(j, 0, W) {
        if (s[i][j] == '#') {
          ans[i][j] = n;
          ++n;
        } else {
          ans[i][j] = n;
        }
      }
      if (s[i][W - 1] == '.') {
        --n;
        for (int j = W - 1; s[i][j] == '.'; --j)
          ans[i][j] = n;
        ++n;
      }
    }
  }
  rep(i, 0, H - 1) {
    if (s[i] == dotsline) {
      int k = i;
      while (k < H && ans[k][0] == -1)
        ++k;
      if (k >= H)
        continue;
      rep(j, 0, W) cout << ans[k][j] << ' ';
      cout << "\n";
    } else {
      rep(j, 0, W) cout << ans[i][j] << ' ';
      cout << "\n";
    }
  }
  if (s[H - 1] == dotsline) {
    int k = H - 1;
    while (ans[k][0] == -1)
      --k;
    rep(i, k + 1, H) rep(j, 0, W) cout << ans[k][j] << ' ';
  } else
    rep(i, 0, W) cout << ans[H - 1][i] << ' ';
}

// 境界，出力文字列 チェック
// 可読性優先．高速化次点．
// まずは全探索，分割統治，次にDP
// 制限を見る
// 偶奇，逆から，ソート，出現回数，出現位置，DP， 余事象，包除
// データ構造． 問題の特徴量．単調性，二分探索
// 存在判定：構成方法，入力の特徴
// gcd, lcm ,素因数分解．
// 例外を十分に含む一般化．想像力の限界
// 小さい系から例示
// 始めは過剰に例示・場合分けしてもいい．各場合を確実に対処．
// 自明な例から処理，除外．
// 小数のときは，精度の設定する．doubel 変数に数値を入力するときは 123. とする．
// テストケース作成は数表あり