#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); } 
template <typename T> void read(T &x) {
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
template <typename T> void write(T x) {
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {
	write(x);
	puts("");
}
namespace ShortestPath {
	const ll INF = 1e18;
	const int MAXP = 1e6;
	struct edge {int dest, len; };
	int n; ll dist[MAXP];
	vector <edge> a[MAXP];
	set <pair <ll, int> > st;
	void addedge(int x, int y, int z) {
		a[x].push_back((edge) {y, z});
	}
	void init(int x) {
		n = x; st.clear();
		for (int i = 1; i <= n; i++) {
			dist[i] = INF;
			a[i].clear();
		}
	}
	void work(int s) {
		dist[s] = 0;
		st.insert(make_pair(0, s));
		while (!st.empty()) {
			pair <ll, int> tmp = *st.begin();
			st.erase(tmp);
			for (unsigned i = 0; i < a[tmp.second].size(); i++) {
				int dest = a[tmp.second][i].dest;
				ll newlen = tmp.first + a[tmp.second][i].len;
				if (newlen < dist[dest]) {
					st.erase(make_pair(dist[dest], dest));
					dist[dest] = newlen;
					st.insert(make_pair(dist[dest], dest));
				}
			}
		}
	}
}
int n, m, q;
char h[MAXN], v[MAXN];
int hpre[MAXN][2], hsuf[MAXN][2];
int vpre[MAXN][2], vsuf[MAXN][2];
int nx, ny; vector <int> x, y;
bool sx[MAXN], sy[MAXN];
void addx(int pos) {
	if (!sx[pos]) {
		sx[pos] = true;
		x.push_back(pos);
	}
}
void addy(int pos) {
	if (!sy[pos]) {
		sy[pos] = true;
		y.push_back(pos);
	}
}
int path(pair <int, int> s, pair <int, int> t) {
	nx = x.size(), ny = y.size();
	static int point[16][16];
	int tot = 0;
	for (int i = 0; i < nx; i++)
	for (int j = 0; j < ny; j++)
		point[i][j] = ++tot;
	ShortestPath :: init(tot);
	for (int i = 0; i < nx; i++)
	for (int j = 0; j < ny; j++) {
		if (h[x[i]] == 'E' && j < ny - 1) ShortestPath :: addedge(point[i][j], point[i][j + 1], y[j + 1] - y[j]);
		if (h[x[i]] == 'W' && j > 0) ShortestPath :: addedge(point[i][j], point[i][j - 1], y[j] - y[j - 1]);
		if (v[y[j]] == 'S' && i < nx - 1) ShortestPath :: addedge(point[i][j], point[i + 1][j], x[i + 1] - x[i]);
		if (v[y[j]] == 'N' && i > 0) ShortestPath :: addedge(point[i][j], point[i - 1][j], x[i] - x[i - 1]);
	}
	for (int i = 0; i < nx; i++)
	for (int j = 0; j < ny; j++)
		if (x[i] == s.first && y[j] == s.second) ShortestPath :: work(point[i][j]);
	for (int i = 0; i < nx; i++)
	for (int j = 0; j < ny; j++)
		if (x[i] == t.first && y[j] == t.second) {
			ll tmp = ShortestPath :: dist[point[i][j]];
			if (tmp > 1e8) return -1;
			else return tmp;
		}
	assert(false);
	return -1;
}
int main() {
	read(n), read(m), read(q);
	scanf("\n%s\n%s", h + 1, v + 1);
	for (int i = 1; i <= n; i++) {
		hpre[i][0] = hpre[i - 1][0];
		hpre[i][1] = hpre[i - 1][1];
		if (h[i] == 'E') hpre[i][1] = i;
		else hpre[i][0] = i;
	}
	for (int i = n; i >= 1; i--) {
		hsuf[i][0] = hsuf[i + 1][0];
		hsuf[i][1] = hsuf[i + 1][1];
		if (h[i] == 'E') hsuf[i][1] = i;
		else hsuf[i][0] = i;
	}
	for (int i = 1; i <= m; i++) {
		vpre[i][0] = vpre[i - 1][0];
		vpre[i][1] = vpre[i - 1][1];
		if (v[i] == 'S') vpre[i][1] = i;
		else vpre[i][0] = i;
	}
	for (int i = m; i >= 1; i--) {
		vsuf[i][0] = vsuf[i + 1][0];
		vsuf[i][1] = vsuf[i + 1][1];
		if (v[i] == 'S') vsuf[i][1] = i;
		else vsuf[i][0] = i;
	}
	sx[0] = sy[0] = true;
	for (int i = 1; i <= q; i++) {
		pair <int, int> s, t;
		read(s.first), read(s.second);
		read(t.first), read(t.second);
			addy(vsuf[s.second][0]);
			addy(vsuf[s.second][1]);
			addy(vpre[s.second][0]);
			addy(vpre[s.second][1]);
			addy(vpre[t.second][0]);
			addy(vpre[t.second][1]);
			addy(vsuf[t.second][0]);
			addy(vsuf[t.second][1]);
			addx(hsuf[s.first][0]);
			addx(hsuf[s.first][1]);
			addx(hpre[s.first][0]);
			addx(hpre[s.first][1]);
			addx(hpre[t.first][0]);
			addx(hpre[t.first][1]);
			addx(hsuf[t.first][0]);
			addx(hsuf[t.first][1]);
		sort(x.begin(), x.end());
		sort(y.begin(), y.end());
		writeln(path(s, t));
		for (auto pos : x)
			sx[pos] = false;
		for (auto pos : y)
			sy[pos] = false;
		x.clear(), y.clear();
	}
	return 0;
}

Measured memory_bytes: 31232