#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double D;
typedef pair<ll,ll> P;
#define M 1000000007
#define F first
#define PB push_back
#define INF 1000000000
struct f{
	int c,y,x;
	bool operator<(const f&q)const{
		if(c!=q.c)return c<q.c;
		if(y!=q.y)return y<q.y;
		return x<q.x;
	}
	bool operator>(const f&q)const{
		if(c!=q.c)return c>q.c;
		if(y!=q.y)return y>q.y;
		return x>q.x;
	}
};
int n,m,q;
vector<int>tt,yk;
vector<int>N,W,E,S;
int d[10][10];
priority_queue<f,vector<f>,greater<f> >dik;
char h[100005],w[100005];
int solve(int sy,int sx,int ty,int tx){
	for(int i=0;i<yk.size();i++){
		if(yk[i]==sy){
			sy=i;
			break;
		}
	}
	for(int i=0;i<yk.size();i++){
		if(yk[i]==ty){
			ty=i;
			break;
		}
	}
	for(int i=0;i<tt.size();i++){
		if(tt[i]==sx){
			sx=i;
			break;
		}
	}
	for(int i=0;i<tt.size();i++){
		if(tt[i]==tx){
			tx=i;
			break;
		}
	}
	for(int i=0;i<yk.size();i++)for(int j=0;j<tt.size();j++)d[i][j]=INF;
	d[sy][sx]=0;
	dik.push(f{0,sy,sx});
	while(!dik.empty()){
		ll c=dik.top().c,y=dik.top().y,x=dik.top().x;
		dik.pop();
		if(d[y][x]<c)continue;
		if(h[yk[y]]=='W'){
			if(x>0&&d[y][x-1]>c+tt[x]-tt[x-1]){
				d[y][x-1]=c+tt[x]-tt[x-1];
				dik.push(f{d[y][x-1],y,x-1});
			}
		}else{
			if(x+1<tt.size()&&d[y][x+1]>c+tt[x+1]-tt[x]){
				d[y][x+1]=c+tt[x+1]-tt[x];
				dik.push(f{d[y][x+1],y,x+1});
			}
		}
		if(w[tt[x]]=='N'){
			if(y>0&&d[y-1][x]>c+yk[y]-yk[y-1]){
				d[y-1][x]=c+yk[y]-yk[y-1];
				dik.push(f{d[y-1][x],y-1,x});
			}
		}else{
			if(y+1<yk.size()&&d[y+1][x]>c+yk[y+1]-yk[y]){
				d[y+1][x]=c+yk[y+1]-yk[y];
				dik.push(f{d[y+1][x],y+1,x});
			}
		}
	}
	return d[ty][tx];
}
int main(void){
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++){
		scanf(" %c",&h[i]);
		if(h[i]=='E')E.PB(i);
		else W.PB(i);
	}
    for(int i=1;i<=m;i++){
		scanf(" %c",&w[i]);
		if(w[i]=='N')N.PB(i);
		else S.PB(i);
	}
    while(q--){
		int a,b,c,d;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		yk.clear();
		tt.clear();
		yk.PB(a);
		yk.PB(c);
		tt.PB(b);
		tt.PB(d);
		int x=lower_bound(W.begin(),W.end(),a)-W.begin();
		if(x<W.size())yk.PB(W[x]);
		x=lower_bound(E.begin(),E.end(),a)-E.begin();
		if(x<E.size())yk.PB(E[x]);
		x=upper_bound(W.begin(),W.end(),a)-W.begin()-1;
		if(0<=x)yk.PB(W[x]);
		x=upper_bound(E.begin(),E.end(),a)-E.begin()-1;
		if(0<=x)yk.PB(E[x]);
		
		x=lower_bound(W.begin(),W.end(),c)-W.begin();
		if(x<W.size())yk.PB(W[x]);
		x=lower_bound(E.begin(),E.end(),c)-E.begin();
		if(x<E.size())yk.PB(E[x]);
		x=upper_bound(W.begin(),W.end(),c)-W.begin()-1;
		if(0<=x)yk.PB(W[x]);
		x=upper_bound(E.begin(),E.end(),c)-E.begin()-1;
		if(0<=x)yk.PB(E[x]);
		
		x=lower_bound(N.begin(),N.end(),b)-N.begin();
		if(x<N.size())tt.PB(N[x]);
		x=lower_bound(S.begin(),S.end(),b)-S.begin();
		if(x<S.size())tt.PB(S[x]);
		x=upper_bound(N.begin(),N.end(),b)-N.begin()-1;
		if(0<=x)tt.PB(N[x]);
		x=upper_bound(S.begin(),S.end(),b)-S.begin()-1;
		if(0<=x)tt.PB(S[x]);
		
		x=lower_bound(N.begin(),N.end(),d)-N.begin();
		if(x<N.size())tt.PB(N[x]);
		x=lower_bound(S.begin(),S.end(),d)-S.begin();
		if(x<S.size())tt.PB(S[x]);
		x=upper_bound(N.begin(),N.end(),d)-N.begin()-1;
		if(0<=x)tt.PB(N[x]);
		x=upper_bound(S.begin(),S.end(),d)-S.begin()-1;
		if(0<=x)tt.PB(S[x]);
		
		sort(yk.begin(),yk.end());
		sort(tt.begin(),tt.end());
		yk.erase(unique(yk.begin(),yk.end()),yk.end());
		tt.erase(unique(tt.begin(),tt.end()),tt.end());
		int ans=solve(a,b,c,d);
		if(ans==INF)ans=-1;
		printf("%d\n",ans);
	}
}

Measured memory_bytes: 2768