Problem p03084 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;

#define MAX 200002

int n;
int m;

char buf[MAX];
string s;
string t;

int qq;

vector<int> row[2];
vector<int> col[2];

vector<int> R;
vector<int> C;

void row_ava(int y) {
  for (int i = 0; i < 2; i++) {
    int id = lower_bound(row[i].begin(), row[i].end(), y) - row[i].begin();
    if (id != row[i].size()) {
      R.push_back(row[i][id]);
    }
    id--;
    if (id >= 0) {
      R.push_back(row[i][id]);
    }
    id++;
    if (id != row[i].size() && row[i][id] == y) {
      id++;
      if (id != row[i].size()) {
        R.push_back(row[i][id]);
      }
    }
  }
}
void col_ava(int y) {
  for (int i = 0; i < 2; i++) {
    int id = lower_bound(col[i].begin(), col[i].end(), y) - col[i].begin();
    if (id != col[i].size()) {
      C.push_back(col[i][id]);
    }
    id--;
    if (id >= 0) {
      C.push_back(col[i][id]);
    }
    id++;
    if (id != col[i].size() && col[i][id] == y) {
      id++;
      if (id != col[i].size()) {
        C.push_back(col[i][id]);
      }
    }
  }
}

int dist[8][8];
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>,
               greater<pair<int, pair<int, int>>>>
    q;

int main() {
  cin >> n >> m >> qq;
  scanf("%s", buf);
  s = buf;
  scanf("%s", buf);
  t = buf;
  for (int i = 0; i < s.size(); i++) {
    if (s[i] == 'W') {
      row[0].push_back(i);
    } else {
      row[1].push_back(i);
    }
  }
  for (int i = 0; i < t.size(); i++) {
    if (t[i] == 'N') {
      col[0].push_back(i);
    } else {
      col[1].push_back(i);
    }
  }
  while (qq--) {
    int a, b, c, d;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    a--;
    b--;
    c--;
    d--;
    R.clear();
    C.clear();
    row_ava(a);
    row_ava(c);
    col_ava(b);
    col_ava(d);
    sort(R.begin(), R.end());
    R.erase(unique(R.begin(), R.end()), R.end());
    sort(C.begin(), C.end());
    C.erase(unique(C.begin(), C.end()), C.end());
    pair<int, int> star = make_pair(-1, -1);
    pair<int, int> en = make_pair(-1, -1);
    for (int i = 0; i < R.size(); i++) {
      for (int j = 0; j < C.size(); j++) {
        dist[i][j] = -1;
        if (R[i] == a && C[j] == b) {
          star = make_pair(i, j);
        }
        if (R[i] == c && C[j] == d) {
          en = make_pair(i, j);
        }
      }
    }
    dist[star.first][star.second] = 0;

    q.push(make_pair(0, make_pair(star.first, star.second)));
    while (!q.empty()) {
      int x = q.top().second.first;
      int y = q.top().second.second;
      int est = q.top().first;
      q.pop();
      int ds = dist[x][y];
      if (ds != est)
        continue;
      if (s[R[x]] == 'W') {
        if (y) {
          int nex = (C[y] - C[y - 1]) + ds;
          if (dist[x][y - 1] == -1 || dist[x][y - 1] > nex) {
            dist[x][y - 1] = nex;
            q.push(make_pair(nex, make_pair(x, y - 1)));
            // continue;
          }
        }
      }
      if (s[R[x]] == 'E') {
        if (y + 1 < C.size()) {
          int nex = (C[y + 1] - C[y]) + ds;
          if (dist[x][y + 1] == -1 || dist[x][y + 1] > nex) {
            dist[x][y + 1] = nex;
            q.push(make_pair(nex, make_pair(x, y + 1)));
            // continue;
          }
        }
      }
      if (t[C[y]] == 'N') {
        if (x) {
          int nex = (R[x] - R[x - 1]) + ds;
          if (dist[x - 1][y] == -1 || dist[x - 1][y] > nex) {
            dist[x - 1][y] = nex;
            q.push(make_pair(nex, make_pair(x - 1, y)));
          }
        }
      }
      if (t[C[y]] == 'S') {
        if (x + 1 < R.size()) {
          int nex = (R[x + 1] - R[x]) + ds;
          if (dist[x + 1][y] == -1 || dist[x + 1][y] > nex) {
            dist[x + 1][y] = nex;
            q.push(make_pair(nex, make_pair(x + 1, y)));
          }
        }
      }
    }
    printf("%d\n", dist[en.first][en.second]);
  }

  return 0;
}

Fixed submission:
#include "bits/stdc++.h"
using namespace std;

#define MAX 200002

int n;
int m;

char buf[MAX];
string s;
string t;

int qq;

vector<int> row[2];
vector<int> col[2];

vector<int> R;
vector<int> C;

void row_ava(int y) {
  for (int i = 0; i < 2; i++) {
    int id = lower_bound(row[i].begin(), row[i].end(), y) - row[i].begin();
    if (id != row[i].size()) {
      R.push_back(row[i][id]);
    }
    id--;
    if (id >= 0) {
      R.push_back(row[i][id]);
    }
    id++;
    if (id != row[i].size() && row[i][id] == y) {
      id++;
      if (id != row[i].size()) {
        R.push_back(row[i][id]);
      }
    }
  }
}
void col_ava(int y) {
  for (int i = 0; i < 2; i++) {
    int id = lower_bound(col[i].begin(), col[i].end(), y) - col[i].begin();
    if (id != col[i].size()) {
      C.push_back(col[i][id]);
    }
    id--;
    if (id >= 0) {
      C.push_back(col[i][id]);
    }
    id++;
    if (id != col[i].size() && col[i][id] == y) {
      id++;
      if (id != col[i].size()) {
        C.push_back(col[i][id]);
      }
    }
  }
}

int dist[10][10];
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>,
               greater<pair<int, pair<int, int>>>>
    q;

int main() {
  cin >> n >> m >> qq;
  scanf("%s", buf);
  s = buf;
  scanf("%s", buf);
  t = buf;
  for (int i = 0; i < s.size(); i++) {
    if (s[i] == 'W') {
      row[0].push_back(i);
    } else {
      row[1].push_back(i);
    }
  }
  for (int i = 0; i < t.size(); i++) {
    if (t[i] == 'N') {
      col[0].push_back(i);
    } else {
      col[1].push_back(i);
    }
  }
  while (qq--) {
    int a, b, c, d;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    a--;
    b--;
    c--;
    d--;
    R.clear();
    C.clear();
    row_ava(a);
    row_ava(c);
    col_ava(b);
    col_ava(d);
    sort(R.begin(), R.end());
    R.erase(unique(R.begin(), R.end()), R.end());
    sort(C.begin(), C.end());
    C.erase(unique(C.begin(), C.end()), C.end());
    pair<int, int> star = make_pair(-1, -1);
    pair<int, int> en = make_pair(-1, -1);
    for (int i = 0; i < R.size(); i++) {
      for (int j = 0; j < C.size(); j++) {
        dist[i][j] = -1;
        if (R[i] == a && C[j] == b) {
          star = make_pair(i, j);
        }
        if (R[i] == c && C[j] == d) {
          en = make_pair(i, j);
        }
      }
    }
    dist[star.first][star.second] = 0;

    q.push(make_pair(0, make_pair(star.first, star.second)));
    while (!q.empty()) {
      int x = q.top().second.first;
      int y = q.top().second.second;
      int est = q.top().first;
      q.pop();
      int ds = dist[x][y];
      if (ds != est)
        continue;
      if (s[R[x]] == 'W') {
        if (y) {
          int nex = (C[y] - C[y - 1]) + ds;
          if (dist[x][y - 1] == -1 || dist[x][y - 1] > nex) {
            dist[x][y - 1] = nex;
            q.push(make_pair(nex, make_pair(x, y - 1)));
            // continue;
          }
        }
      }
      if (s[R[x]] == 'E') {
        if (y + 1 < C.size()) {
          int nex = (C[y + 1] - C[y]) + ds;
          if (dist[x][y + 1] == -1 || dist[x][y + 1] > nex) {
            dist[x][y + 1] = nex;
            q.push(make_pair(nex, make_pair(x, y + 1)));
            // continue;
          }
        }
      }
      if (t[C[y]] == 'N') {
        if (x) {
          int nex = (R[x] - R[x - 1]) + ds;
          if (dist[x - 1][y] == -1 || dist[x - 1][y] > nex) {
            dist[x - 1][y] = nex;
            q.push(make_pair(nex, make_pair(x - 1, y)));
          }
        }
      }
      if (t[C[y]] == 'S') {
        if (x + 1 < R.size()) {
          int nex = (R[x + 1] - R[x]) + ds;
          if (dist[x + 1][y] == -1 || dist[x + 1][y] > nex) {
            dist[x + 1][y] = nex;
            q.push(make_pair(nex, make_pair(x + 1, y)));
          }
        }
      }
    }
    printf("%d\n", dist[en.first][en.second]);
  }

  return 0;
}