Problem p01437 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
#define rep(i, a, n) for (int i = a; i < n; i++)
#define REP(i, n) rep(i, 0, n)
#define repb(i, a, b) for (int i = a; i >= b; i--)
#define all(a) a.begin(), a.end()
#define int long long
#define chmax(x, y) x = max(x, y)
#define chmin(x, y) x = min(x, y)
using namespace std;
typedef pair<int, int> P;
typedef pair<P, int> PP;
const int mod = 1000000007;
const int INF = 1e12;

char c[110][110];
int d[110][110][4];
int h, w, l;
string str = "NESW";
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
bool contain(int y, int x) { return (0 <= y && y < h && 0 <= x && x < w); }

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  while (1) {
    cin >> h >> w >> l;
    if (h + w + l == 0)
      break;
    int dr = 0, y = 0, x = 0;
    rep(i, 0, h) rep(j, 0, w) rep(k, 0, 4) d[i][j][k] = -1;
    rep(i, 0, h) {
      rep(j, 0, w) {
        cin >> c[i][j];
        if (str.find(c[i][j]) != string::npos) {
          dr = str.find(c[i][j]);
          y = i;
          x = j;
        }
      }
    }
    // cerr << dr << endl;
    d[y][x][dr] = 0;
    vector<PP> sv;
    sv.push_back(PP(P(y, x), dr));
    for (int i = 1;; i++) {
      int ny = 0, nx = 0;
      // cerr << i << ' ' << ny << ' ' << nx << ' ' << dr << endl;
      for (int j = 0;; j++) {
        ny = y + dy[dr];
        nx = x + dx[dr];
        if (contain(ny, nx) && c[ny][nx] != '#') {
          break;
        }
        dr = (dr + 1) % 4;
        // cerr << dr << endl;
      }
      y = ny;
      x = nx;
      if (i == l) {
        cout << y + 1 << ' ' << x + 1 << ' ' << str[dr] << endl;
        break;
      }
      if (d[y][x][dr] != -1) {
        int loop = i - d[y][x][dr];
        int step = d[y][x][dr] + (l - d[y][x][dr]) % loop;
        // cerr << loop << ' ' << step << endl;
        cout << sv[step].first.first + 1 << ' ' << sv[step].first.second + 1
             << ' ' << str[sv[step].second] << endl;
        break;
      }
      d[y][x][dr] = i;
      sv.push_back(PP(P(y, x), dr));
    }
  }
}


Error: 0
8 2
8 11
4 7


Fixed submission:

#include <bits/stdc++.h>
#define rep(i, a, n) for (int i = a; i < n; i++)
#define REP(i, n) rep(i, 0, n)
#define repb(i, a, b) for (int i = a; i >= b; i--)
#define all(a) a.begin(), a.end()
#define int long long
#define chmax(x, y) x = max(x, y)
#define chmin(x, y) x = min(x, y)
using namespace std;
typedef pair<int, int> P;
typedef pair<P, int> PP;
const int mod = 1000000007;
const int INF = 1e12;

char c[110][110];
int d[110][110][4];
int h, w, l;
string str = "NESW";
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};
bool contain(int y, int x) { return (0 <= y && y < h && 0 <= x && x < w); }

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  while (1) {
    cin >> h >> w >> l;
    if (h + w + l == 0)
      break;
    int dr = 0, y = 0, x = 0;
    rep(i, 0, 110) rep(j, 0, 110) rep(k, 0, 4) d[i][j][k] = -1;
    rep(i, 0, h) {
      rep(j, 0, w) {
        cin >> c[i][j];
        if (str.find(c[i][j]) != string::npos) {
          dr = str.find(c[i][j]);
          y = i;
          x = j;
        }
      }
    }
    d[y][x][dr] = 0;
    vector<PP> sv;
    sv.push_back(PP(P(y, x), dr));
    for (int i = 1;; i++) {
      int ny = 0, nx = 0;
      while (1) {
        ny = y + dy[dr];
        nx = x + dx[dr];
        if (contain(ny, nx) && c[ny][nx] != '#') {
          break;
        }
        dr = (dr + 1) % 4;
      }
      y = ny;
      x = nx;
      if (i == l) {
        cout << y + 1 << ' ' << x + 1 << ' ' << str[dr] << endl;
        break;
      }
      if (d[y][x][dr] != -1) {
        int loop = i - d[y][x][dr];
        int step = d[y][x][dr] + (l - d[y][x][dr]) % loop;
        cerr << loop << ' ' << step << endl;
        cout << sv[step].first.first + 1 << ' ' << sv[step].first.second + 1
             << ' ' << str[sv[step].second] << endl;
        break;
      }
      d[y][x][dr] = i;
      sv.push_back(PP(P(y, x), dr));
    }
  }
}