#include <bits/stdc++.h>
using namespace std;
template <typename T>
void cmax(T& a, T b) {
  a = max(a, b);
}
template <typename T>
void cmin(T& a, T b) {
  a = min(a, b);
}
void _BG(const char* s) {}
template <typename T, typename... TT>
void _BG(const char* s, T a, TT... b) {
  for (int c = 0; *s && (c || *s != ','); ++s) {
    cerr << *s;
    switch (*s) {
      case '(':
      case '[':
      case '{':
        ++c;
        break;
      case ')':
      case ']':
      case '}':
        --c;
        break;
    }
  }
  cerr << " = " << a;
  if (*s) {
    cerr << ", ";
    _BG(++s, b...);
  } else
    cerr << endl;
}
bool RD(void) { return true; }
bool RD(char& a) { return scanf(" %c", &a) == 1; }
bool RD(char* a) { return scanf("%s", a) == 1; }
bool RD(double& a) { return scanf("%lf", &a) == 1; }
bool RD(int& a) { return scanf("%d", &a) == 1; }
bool RD(long long& a) { return scanf("%lld", &a) == 1; }
template <typename T, typename... TT>
bool RD(T& a, TT&... b) {
  return RD(a) && RD(b...);
}
void PT(const char a) { putchar(a); }
void PT(const char* a) { fputs(a, stdout); }
void PT(char* a) { fputs(a, stdout); }
void PT(const double a) { printf("%.16f", a); }
void PT(const int a) { printf("%d", a); }
void PT(const long long a) { printf("%lld", a); }
template <char sep = ' ', char end = '\n'>
void PL(void) {
  if (end) PT(end);
}
template <char sep = ' ', char end = '\n', typename T, typename... TT>
void PL(const T a, const TT... b) {
  PT(a);
  if (sizeof...(b) && sep) PT(sep);
  PL<sep, end>(b...);
}
const int N = 1e5 + 87;
vector<int> g[N];
int c[N];
bool s[N];
int tin[N], tout[N], dfn, sz[N];
void dfs(int u) {
  sz[u] = 1;
  tin[u] = ++dfn;
  for (int v : g[u]) {
    dfs(v);
    sz[u] += sz[v];
  }
  tout[u] = ++dfn;
}
int main() {
  int n;
  RD(n);
  int m;
  RD(m);
  int k;
  RD(k);
  int q;
  RD(q);
  for (int __i(0), _B(k); __i < _B; ++__i) {
    int a;
    RD(a);
    int b;
    RD(b);
    if (c[b]) {
      g[c[b]].push_back(a);
      s[a] = true;
    }
    c[b] = a;
  }
  for (int i(1), _B((n) + 1); i < _B; ++i)
    if (!s[i]) dfs(i);
  for (int __i(0), _B(q); __i < _B; ++__i) {
    int x;
    RD(x);
    int y;
    RD(y);
    y = c[y];
    if (y && tin[x] < tin[y] && tout[y] < tout[x])
      PL(sz[x]);
    else
      PL(0);
  }
}
