#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50100, LIMIT = 500, TIME = 1000;
int n, m, q, o, onl[MAXN], big[MAXN], ima[MAXN], bio[MAXN], ans[MAXN];
vector<int> E[MAXN], A[MAXN], D[MAXN], BE[MAXN], BA[MAXN], BD[MAXN], change;
void balance() {
  for (int i = 0; i < n; ++i) {
    change.clear();
    for (vector<int>::iterator it = E[i].begin(); it != E[i].end(); ++it) {
      ++ima[*it];
      if (!bio[*it]) bio[*it] = 1, change.push_back(*it);
    }
    for (vector<int>::iterator it = A[i].begin(); it != A[i].end(); ++it) {
      ++ima[*it];
      if (!bio[*it]) bio[*it] = 1, change.push_back(*it);
    }
    for (vector<int>::iterator it = D[i].begin(); it != D[i].end(); ++it) {
      --ima[*it];
      if (!bio[*it]) bio[*it] = 1, change.push_back(*it);
    }
    E[i].clear();
    A[i].clear();
    D[i].clear();
    BE[i].clear();
    BA[i].clear();
    BD[i].clear();
    for (vector<int>::iterator it = change.begin(); it != change.end(); ++it) {
      bio[*it] = 0;
      if (ima[*it] > 0) E[i].push_back(*it);
      ima[*it] = 0;
    }
    if ((int)E[i].size() >= LIMIT)
      big[i] = 1;
    else
      big[i] = 0;
    ans[i] = 0;
    if (big[i]) {
      for (vector<int>::iterator it = E[i].begin(); it != E[i].end(); ++it)
        ans[i] += onl[*it];
    }
  }
  for (int i = 0; i < n; ++i) {
    for (vector<int>::iterator it = E[i].begin(); it != E[i].end(); ++it) {
      if (big[*it]) BE[i].push_back(*it);
    }
  }
}
void update(int x, int val) {
  onl[x] = val;
  int v = (val ? 1 : -1);
  for (vector<int>::iterator it = BE[x].begin(); it != BE[x].end(); ++it)
    ans[*it] += v;
  for (vector<int>::iterator it = BA[x].begin(); it != BA[x].end(); ++it)
    ans[*it] += v;
  for (vector<int>::iterator it = BD[x].begin(); it != BD[x].end(); ++it)
    ans[*it] -= v;
}
int query(int x) {
  if (big[x])
    return ans[x];
  else {
    int ret = 0;
    for (vector<int>::iterator it = E[x].begin(); it != E[x].end(); ++it)
      ret += onl[*it];
    for (vector<int>::iterator it = A[x].begin(); it != A[x].end(); ++it)
      ret += onl[*it];
    for (vector<int>::iterator it = D[x].begin(); it != D[x].end(); ++it)
      ret -= onl[*it];
    return ret;
  }
}
int main() {
  scanf("%d%d%d%d", &n, &m, &q, &o);
  for (int i = 0; i < o; ++i) {
    int x;
    scanf("%d", &x);
    onl[x - 1] = 1;
  }
  for (int i = 0; i < m; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    E[a].push_back(b);
    E[b].push_back(a);
  }
  int Time = 0;
  for (int i = 0; i < q; ++i) {
    if (Time % TIME == 0) balance(), ++Time;
    int a, b;
    char tip[5];
    scanf("%s%d", tip, &a);
    --a;
    if (tip[0] == 'O')
      update(a, 1);
    else if (tip[0] == 'F')
      update(a, 0);
    else if (tip[0] == 'A') {
      ++Time;
      scanf("%d", &b);
      --b;
      if (big[b]) BA[a].push_back(b), ans[b] += onl[a];
      if (big[a]) BA[b].push_back(a), ans[a] += onl[b];
      A[b].push_back(a);
      A[a].push_back(b);
    } else if (tip[0] == 'D') {
      ++Time;
      scanf("%d", &b);
      --b;
      if (big[b]) BD[a].push_back(b), ans[b] -= onl[a];
      if (big[a]) BD[b].push_back(a), ans[a] -= onl[b];
      D[b].push_back(a);
      D[a].push_back(b);
    } else
      printf("%d\n", query(a));
  }
  return 0;
}
