812_D. Sagheer and Kindergarten_17251
Sagheer is working at a kindergarten. There are n children and m different toys. These children use well-defined protocols for playing with the toys:

  * Each child has a lovely set of toys that he loves to play with. He requests the toys one after another at distinct moments of time. A child starts playing if and only if he is granted all the toys in his lovely set.
  * If a child starts playing, then sooner or later he gives the toys back. No child keeps the toys forever.
  * Children request toys at distinct moments of time. No two children request a toy at the same time.
  * If a child is granted a toy, he never gives it back until he finishes playing with his lovely set.
  * If a child is not granted a toy, he waits until he is granted this toy. He can't request another toy while waiting.
  * If two children are waiting for the same toy, then the child who requested it first will take the toy first.



Children don't like to play with each other. That's why they never share toys. When a child requests a toy, then granting the toy to this child depends on whether the toy is free or not. If the toy is free, Sagheer will give it to the child. Otherwise, the child has to wait for it and can't request another toy.

Children are smart and can detect if they have to wait forever before they get the toys they want. In such case they start crying. In other words, a crying set is a set of children in which each child is waiting for a toy that is kept by another child in the set.

Now, we have reached a scenario where all the children made all the requests for their lovely sets, except for one child x that still has one last request for his lovely set. Some children are playing while others are waiting for a toy, but no child is crying, and no one has yet finished playing. If the child x is currently waiting for some toy, he makes his last request just after getting that toy. Otherwise, he makes the request right away. When child x will make his last request, how many children will start crying?

You will be given the scenario and q independent queries. Each query will be of the form x y meaning that the last request of the child x is for the toy y. Your task is to help Sagheer find the size of the maximal crying set when child x makes his last request.

Input

The first line contains four integers n, m, k, q (1 ≤ n, m, k, q ≤ 105) — the number of children, toys, scenario requests and queries.

Each of the next k lines contains two integers a, b (1 ≤ a ≤ n and 1 ≤ b ≤ m) — a scenario request meaning child a requests toy b. The requests are given in the order they are made by children.

Each of the next q lines contains two integers x, y (1 ≤ x ≤ n and 1 ≤ y ≤ m) — the request to be added to the scenario meaning child x will request toy y just after getting the toy he is waiting for (if any).

It is guaranteed that the scenario requests are consistent and no child is initially crying. All the scenario requests are distinct and no query coincides with a scenario request.

Output

For each query, print on a single line the number of children who will start crying when child x makes his last request for toy y. Please answer all queries independent of each other.

Examples

Input

3 3 5 1
1 1
2 2
3 3
1 2
2 3
3 1


Output

3


Input

5 4 7 2
1 1
2 2
2 1
5 1
3 3
4 4
4 1
5 3
5 4


Output

0
2

Note

In the first example, child 1 is waiting for toy 2, which child 2 has, while child 2 is waiting for top 3, which child 3 has. When child 3 makes his last request, the toy he requests is held by child 1. Each of the three children is waiting for a toy held by another child and no one is playing, so all the three will start crying.

In the second example, at the beginning, child i is holding toy i for 1 ≤ i ≤ 4. Children 1 and 3 have completed their lovely sets. After they finish playing, toy 3 will be free while toy 1 will be taken by child 2 who has just completed his lovely set. After he finishes, toys 1 and 2 will be free and child 5 will take toy 1. Now:

  * In the first query, child 5 will take toy 3 and after he finishes playing, child 4 can play.
  * In the second query, child 5 will request toy 4 which is held by child 4. At the same time, child 4 is waiting for toy 1 which is now held by child 5. None of them can play and they will start crying. 
#include <bits/stdc++.h>
#pragma warning(disable : 4996)
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("-ffloat-store")
using namespace std;
clock_t time_p = clock();
void aryanc403() {
  time_p = clock() - time_p;
  cerr << "Time Taken : " << (float)(time_p) / CLOCKS_PER_SEC << "\n";
}
const long long int INF = 0xFFFFFFFFFFFFFFFL;
long long int seed;
mt19937 rng(seed = chrono::steady_clock::now().time_since_epoch().count());
inline long long int rnd(long long int l = 0, long long int r = INF) {
  return uniform_int_distribution<long long int>(l, r)(rng);
}
class CMP {
 public:
  bool operator()(pair<long long int, long long int> a,
                  pair<long long int, long long int> b) {
    return !(a.first < b.first || a.first == b.first && a.second <= b.second);
  }
};
void add(map<long long int, long long int> &m, long long int x,
         long long int cnt = 1) {
  auto jt = m.find(x);
  if (jt == m.end())
    m.insert({x, cnt});
  else
    jt->second += cnt;
}
void del(map<long long int, long long int> &m, long long int x,
         long long int cnt = 1) {
  auto jt = m.find(x);
  if (jt->second <= cnt)
    m.erase(jt);
  else
    jt->second -= cnt;
}
bool cmp(const pair<long long int, long long int> &a,
         const pair<long long int, long long int> &b) {
  return a.first < b.first || (a.first == b.first && a.second < b.second);
}
const long long int mod = 1000000007L;
const long long int maxN = 100000L;
long long int T, n, i, j, k, in, cnt, l, r, u, v, x, y;
long long int m, q, toy, cld;
string s;
vector<long long int> a;
long long int tin[maxN + 5], tout[maxN + 5], lst[maxN + 5], p[maxN + 5];
vector<long long int> e[maxN + 5];
bool root[maxN + 5];
bool isAnc(long long int u, long long int v) {
  return tin[u] <= tin[v] && tout[v] <= tout[u];
}
void dfs(long long int u) {
  tin[u] = ++T;
  for (auto x : e[u]) dfs(x);
  tout[u] = T;
}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  {
    cin >> n >> m >> k >> q;
    for (i = (1); i <= (n); ++i) root[i] = true;
    for (i = 0; i < (k); ++i) {
      cin >> cld >> toy;
      if (lst[toy]) {
        p[cld] = lst[toy];
        root[cld] = false;
      }
      lst[toy] = cld;
    }
    for (i = (1); i <= (n); ++i) e[p[i]].push_back(i);
    for (i = (1); i <= (n); ++i)
      if (root[i]) dfs(i);
    ;
    ;
    ;
    ;
    while (q--) {
      cin >> cld >> toy;
      n = lst[toy];
      ;
      if (isAnc(cld, n))
        cout << tout[cld] - tin[cld] + 1 << "\n";
      else
        cout << 0 << "\n";
    }
  }
  aryanc403();
  return 0;
}
