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

#include <cstdio>
#include <iostream>
#include <string>
#include <utility>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define dm(x) cerr << #x << " = " << x << endl;
using namespace std;

char map[20][21];
int H, W, N;

struct po {
  int x;
  int y;
  po operator+(po &p) {
    po t = {x + p.x, y + p.y};
    return t;
  }
  char &l() { return map[x][y]; }
  bool v() { return 0 <= x && x < H && 0 <= y && y < W; }
  void d() {
    dm(x);
    dm(y);
  }
};

po mp(int x, int y) {
  po t = {x, y};
  return t;
}

int main() {
  int T;
  scanf("%d", &T);
  rep(datasetindex, T) {
    po p = {0, 0}, d = {0, 0};
    char c[101];
    scanf("%d %d", &H, &W);
    rep(i, H) scanf("%s", map[i]);
    scanf("%d", &N);
    scanf("%s", c);
    // dm(H);dm(W);
    rep(j, W) rep(i, H) {
      switch (map[i][j]) {
      case '^':
        p = mp(i, j);
        d = mp(-1, 0);
        break;
      case '>':
        p = mp(i, j);
        d = mp(0, 1);
        break;
      case 'v':
        p = mp(i, j);
        d = mp(1, 0);
        break;
      case '<':
        p = mp(i, j);
        d = mp(0, -1);
        break;
      }
    }
    // rep(i,H) printf("%d : %s\\n", i, map[i]);
    // p.d();d.d();
    rep(i, N) {
      switch (c[i]) {
      case 'S': {
        po s = p;
        do {
          s = s + d;
        } while (s.v() && s.l() != '*' && s.l() != '#');
        if (s.v() && s.l() == '*')
          s.l() = '.';
        break;
      }
      case 'U':
        p.l() = '.';
        d = mp(-1, 0);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = '^';
        break;
      case 'R':
        p.l() = '.';
        d = mp(0, 1);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = '>';
        break;
      case 'D':
        p.l() = '.';
        d = mp(1, 0);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = 'v';
        break;
      case 'L':
        p.l() = '.';
        d = mp(0, -1);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = '<';
        break;
      }
      // rep(i,H) printf("%d : %s\\n", i, map[i]);
    }
    rep(i, H) printf("%s\\n", map[i]);
    if (datasetindex < T - 1)
      printf("\\n");
  }
}

Error: WA

Fixed submission:

#include <cstdio>
#include <iostream>
#include <string>
#include <utility>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define dm(x) cerr << #x << " = " << x << endl;
using namespace std;

char map[20][21];
int H, W, N;

struct po {
  int x;
  int y;
  po operator+(po &p) {
    po t = {x + p.x, y + p.y};
    return t;
  }
  char &l() { return map[x][y]; }
  bool v() { return 0 <= x && x < H && 0 <= y && y < W; }
  void d() {
    dm(x);
    dm(y);
  }
};

po mp(int x, int y) {
  po t = {x, y};
  return t;
}

int main() {
  int T;
  scanf("%d", &T);
  rep(datasetindex, T) {
    po p = {0, 0}, d = {0, 0};
    char c[101];
    scanf("%d %d", &H, &W);
    rep(i, H) scanf("%s", map[i]);
    scanf("%d", &N);
    scanf("%s", c);
    dm(H);
    dm(W);
    rep(j, W) rep(i, H) {
      switch (map[i][j]) {
      case '^':
        p = mp(i, j);
        d = mp(-1, 0);
        break;
      case '>':
        p = mp(i, j);
        d = mp(0, 1);
        break;
      case 'v':
        p = mp(i, j);
        d = mp(1, 0);
        break;
      case '<':
        p = mp(i, j);
        d = mp(0, -1);
        break;
      }
    }
    rep(i, H) printf("%d : %s\\n", i, map[i]);
    p.d();
    d.d();
    rep(i, N) {
      dm(c[i]);
      switch (c[i]) {
      case 'S': {
        po s = p;
        do {
          s = s + d;
        } while (s.v() && s.l() != '*' && s.l() != '#');
        if (s.v() && s.l() == '*')
          s.l() = '.';
        break;
      }
      case 'U':
        p.l() = '.';
        d = mp(-1, 0);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = '^';
        break;
      case 'R':
        p.l() = '.';
        d = mp(0, 1);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = '>';
        break;
      case 'D':
        p.l() = '.';
        d = mp(1, 0);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = 'v';
        break;
      case 'L':
        p.l() = '.';
        d = mp(0, -1);
        if ((p + d).v() && (p + d).l() == '.')
          p = p + d;
        p.l() = '<';
        break;
      }
      rep(i, H) printf("%d : %s\\n", i, map[i]);
    }
  }
}