#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[20][20];
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;
}

Measured memory_bytes: 2896