#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#include <cstdlib>
#define llint long long
#define inf 100000000000000000


using namespace std;
typedef pair<llint, llint> P;

struct edge{
	llint to, cost;
	edge(){}
	edge(llint a, llint b){
		to = a, cost = b;
	}
};

llint H, W, Q;
string s, t;
llint prel[200005], prer[200005], nextl[200005], nextr[200005];
llint preu[200005], pred[200005], nextu[200005], nextd[200005];
vector<llint> vecx, vecy;
vector<edge> G[205];
llint dist[205];
llint S, T, V;

void dijkstra()
{
	for(llint i = 0; i < V; i++) dist[i] = inf;
	dist[S] = 0;
	
	priority_queue< P, vector<P>, greater<P> > PQ;
	PQ.push( make_pair(0, S) );
	
	llint v, d;
	while(PQ.size()){
		d = PQ.top().first;
		v = PQ.top().second;
		PQ.pop();
		if(dist[v] < d) continue;
		for(llint i = 0; i < G[v].size(); i++){
			if(dist[G[v][i].to] > d + G[v][i].cost){
				dist[G[v][i].to] = d + G[v][i].cost;
				PQ.push( make_pair(dist[G[v][i].to], G[v][i].to) );
			}
		}
	}
}

void make(llint s, llint g, vector<llint> &vec, llint N, llint preu[], llint pred[], llint nextu[], llint nextd[])
{
	vec.clear();
	vec.push_back(s);
	vec.push_back(preu[s]);
	vec.push_back(pred[s]);
	vec.push_back(nextu[s]);
	vec.push_back(nextd[s]);
	vec.push_back(g);
	vec.push_back(preu[g]);
	vec.push_back(pred[g]);
	vec.push_back(nextu[g]);
	vec.push_back(nextd[g]);
	
	sort(vec.begin(), vec.end());
	vec.erase(unique(vec.begin(), vec.end()), vec.end());
	if(vec.front() == 0) vec.erase(vec.begin());
	if(vec.back() == N+1) vec.erase(vec.end()-1);
}

int main(void)
{
	cin >> H >> W >> Q;
	cin >> s >> t;
	s = "#" + s + "#"; t = "#" + t + "#";
	
	prel[0] = 0, prer[0] = 0;
	for(llint i = 1; i <= H; i++){
		prel[i] = prel[i-1];
		prer[i] = prer[i-1];
		if(s[i-1] == 'W') prel[i] = i-1;
		if(s[i-1] == 'E') prer[i] = i-1;
	}
	nextl[H+1] = H+1, nextr[H+1] = H+1;
	for(llint i = H; i >= 1; i--){
		nextl[i] = nextl[i+1];
		nextr[i] = nextr[i+1];
		if(s[i+1] == 'W') nextl[i] = i+1;
		if(s[i+1] == 'E') nextr[i] = i+1;
	}
	
	preu[0] = 0, pred[0] = 0;
	for(llint i = 1; i <= W; i++){
		preu[i] = preu[i-1];
		pred[i] = pred[i-1];
		if(t[i-1] == 'N') preu[i] = i-1;
		if(t[i-1] == 'S') pred[i] = i-1;
	}
	nextu[W+1] = W+1, nextd[W+1] = W+1;
	for(llint i = W; i >= 1; i--){
		nextu[i] = nextu[i+1];
		nextd[i] = nextd[i+1];
		if(t[i+1] == 'N') nextu[i] = i+1;
		if(t[i+1] == 'S') nextd[i] = i+1;
	}
	
	llint sx, sy, gx, gy;
	for(llint q = 0; q < Q; q++){
		cin >> sy >> sx >> gy >> gx;
		make(sx, gx, vecx, W, preu, pred, nextu, nextd);
		make(sy, gy, vecy, H, prel, prer, nextl, nextr);
		
		llint w = vecx.size(), h = vecy.size();
		for(llint i = 0; i < w*h; i++) G[i].clear();
		for(llint x = 0; x < w; x++){
			for(llint y = 0; y < h; y++){
				llint nx = x, ny = y;
				if(t[vecx[x]] == 'N') ny--;
				else ny++;
				if(ny >= 0 && ny < h){
					G[x+y*w].push_back(edge(nx+ny*w, abs(vecy[y]-vecy[ny])));
				}
				nx = x, ny = y;
				if(s[vecy[y]] == 'W') nx--;
				else nx++;
				if(nx >= 0 && nx < w){
					G[x+y*w].push_back(edge(nx+ny*w, abs(vecx[x]-vecx[nx])));
				}
			}
		}
		llint SX, GX, SY, GY;
		for(llint i = 0; i < w; i++){
			if(vecx[i] == sx) SX = i;
			if(vecx[i] == gx) GX = i;
		}
		for(llint i = 0; i < h; i++){
			if(vecy[i] == sy) SY = i;
			if(vecy[i] == gy) GY = i;
		}
		S = SX + SY*w, T = GX + GY*w, V = w*h;
		
		dijkstra();
		if(dist[T] >= inf) cout << -1 << "\n";
		else cout << dist[T] << "\n";
	}
	flush(cout);
	
	return 0;
}

Measured memory_bytes: 13284