#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int,int> p;
int map[505][505];
bool visited[505][505];
p team[100005];
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
int n,m,a,b;
queue<p> q;
bool check(int x,int y,int step){
if(x<1||x>n||y<1||y>m) return false;
if((map[x][y]>= step + 1) && visited[x][y]) return false;
if(visited[x][y]) return false;
return true;
}
int main(int argc, char** argv) {
memset(map,0,sizeof(map));
int x,y;
scanf("%d%d%d%d",&n,&m,&a,&b);
for(int i = 0;i<a;i++){
scanf("%d %d",&x,&y);
q.push(make_pair(x,y));
}
for(int i = 0;i<b;i++){
scanf("%d %d",&x,&y);
team[i] = make_pair(x,y);
}
while(!q.empty()){
p top =q.front();
q.pop();
int x = top.first,y = top.second;
for(int i =0;i<4;i++){
if(check(x+ dx[i],y+dy[i],map[x][y])){
q.push(make_pair(x+ dx[i],y+dy[i]));
map[x+ dx[i]][y+dy[i]]=map[x][y]+1;
visited[x+ dx[i]][y+dy[i]] =true;
}
}
}
for(int i= 0;i<b;i++){
int x = team[i].first,y =team[i].second;
printf("%d\n",map[x][y]);
}
return 0;
}