#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+5;
int n,m,q,tot,id[7][7],dis[50][50];
vector<int>north,south,east,west;
char s1[N],s2[N];
unordered_map<int,int>vis1,vis2;
vector<int>v1,v2;
void solve2(int a,int b)
{
    int pos;
    if(s2[b]=='N')
    {
        pos=lower_bound(south.begin(),south.end(),b)-south.begin();
        if(pos<south.size()&&!vis2[south[pos]])
        {
            v2.push_back(south[pos]);
            vis2[south[pos]]=true;
        }
    }
    else
    {
        pos=lower_bound(north.begin(),north.end(),b)-north.begin();
        if(pos<north.size()&&!vis2[north[pos]])
        {
            v2.push_back(north[pos]);
            vis2[north[pos]]=true;
        }
    }
    if(s2[b]=='N')
    {
        pos=lower_bound(south.begin(),south.end(),b)-south.begin()-1;
        if(pos<south.size()&&!vis2[south[pos]])
        {
            v2.push_back(south[pos]);
            vis2[south[pos]]=true;
        }
    }
    else
    {
        pos=lower_bound(north.begin(),north.end(),b)-north.begin()-1;
        if(pos<north.size()&&!vis2[north[pos]])
        {
            v2.push_back(north[pos]);
            vis2[north[pos]]=true;
        }
    }
}
void solve1(int a,int b)
{
    int pos;
    if(s1[a]=='W')
    {
        pos=lower_bound(east.begin(),east.end(),a)-east.begin();
        if(pos<east.size()&&!vis1[east[pos]])
        {
            v1.push_back(east[pos]);
            vis1[east[pos]]=true;
        }
    }
    else
    {
        pos=lower_bound(west.begin(),west.end(),a)-west.begin();
        if(pos<west.size()&&!vis1[west[pos]])
        {
            v1.push_back(west[pos]);
            vis1[west[pos]]=true;
        }
    }
    if(s1[a]=='W')
    {
        pos=lower_bound(east.begin(),east.end(),a)-east.begin()-1;
        if(pos>=0&&!vis1[east[pos]])
        {
            v1.push_back(east[pos]);
            vis1[east[pos]]=true;
        }
    }
    else
    {
        pos=lower_bound(west.begin(),west.end(),a)-west.begin()-1;
        if(pos>=0&&!vis1[west[pos]])
        {
            v1.push_back(west[pos]);
            vis1[west[pos]]=true;
        }
    }
}
struct node
{
    int u,x;
    node(int u=0,int x=0):u(u),x(x){}
    bool operator<(const node&o)const
    {
        return x>o.x;
    }
};
int d[50*50];
bool vis[50*50];
int dijkstra(int s,int t)
{
    memset(d,inf,sizeof(d));
    memset(vis,false,sizeof(vis));
    priority_queue<node>q;
    d[s]=0;
    q.push(node(s,0));
    while(!q.empty())
    {
        int u=q.top().u;q.pop();
        if(vis[u]) continue;
        if(u==t) return d[t];
        vis[u]=true;
        for(int i=1;i<=tot;i++)
            if(d[i]>d[u]+dis[u][i])
        {
            d[i]=d[u]+dis[u][i];
            q.push(node(i,d[i]));
        }
    }
    return d[t];
}
int main()
{
    scanf("%d%d%d",&n,&m,&q);
    scanf("%s",s1+1);
    for(int i=1;i<=n;i++)
        if(s1[i]=='E')
        east.push_back(i);
    else west.push_back(i);
    scanf("%s",s2+1);
    for(int i=1;i<=m;i++)
        if(s2[i]=='N') north.push_back(i);
    else south.push_back(i);
    while(q--)
    {
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        vis1.clear();vis2.clear();
        v1.clear();v2.clear();
        v1.push_back(a);v2.push_back(b);
        vis1[a]=vis2[b]=true;
        if(!vis1[c]) v1.push_back(c),vis1[c]=true;
        if(!vis2[d]) v2.push_back(d),vis2[d]=true;
        solve1(a,b);solve1(c,d);
        solve2(a,b);solve2(c,d);
        sort(v1.begin(),v1.end());
        sort(v2.begin(),v2.end());
        memset(dis,inf,sizeof(dis));
        memset(id,0,sizeof(id));
        tot=0;
        int s,t;
        for(int i=0;i<v1.size();i++)
            for(int j=0;j<v2.size();j++)
        {
            id[i][j]=++tot;
            if(v1[i]==a&&v2[j]==b) s=tot;
            if(v1[i]==c&&v2[j]==d) t=tot;
            if(j>0)
            {
                if(s1[v1[i]]=='W')
                    dis[id[i][j]][id[i][j-1]]=v2[j]-v2[j-1];
                else dis[id[i][j-1]][id[i][j]]=v2[j]-v2[j-1];
            }
            if(i>0)
            {
                if(s2[v2[j]]=='N')
                    dis[id[i][j]][id[i-1][j]]=v1[i]-v1[i-1];
                else dis[id[i-1][j]][id[i][j]]=v1[i]-v1[i-1];
            }
        }
        for(int i=1;i<=tot;i++) dis[i][i]=0;
        int dis=dijkstra(s,t);
        if(dis==inf) printf("-1\n");
        else printf("%d\n",dis);
    }
}

Measured memory_bytes: 2768