#include <bits/stdc++.h>
using namespace std;
__int128_t gcd(__int128_t a, __int128_t b) { return (b ? gcd(b, a % b) : a); }
__int128_t abs(__int128_t a) { return ((a < 0) ? -a : a); }
struct frac {
  __int128_t a, b;
  frac() {
    a = 0;
    b = 0;
  }
  frac(__int128_t n, __int128_t d) {
    __int128_t g = gcd(abs(n), abs(d));
    if (g) {
      n /= g;
      d /= g;
      if (d < 0) {
        n = -n;
        d = -d;
      }
      if (d == 0) {
        n = abs(n);
      }
    }
    a = n;
    b = d;
  }
  inline frac operator-(const frac& s) const {
    return frac(a * s.b - b * s.a, b * s.b);
  }
  inline frac operator/(const frac& s) const { return frac(a * s.b, b * s.a); }
  inline bool operator<(const frac& s) const {
    if (b == s.b && b == 0) {
      return a < s.a;
    } else if (b == 0) {
      return 1;
    } else if (s.b == 0) {
      return 0;
    } else
      return a * s.b < b * s.a;
  }
  inline bool operator>(const frac& s) const {
    if (b == s.b && b == 0) {
      return a > s.a;
    } else if (b == 0) {
      return 0;
    } else if (s.b == 0) {
      return 1;
    } else
      return a * s.b > b * s.a;
  }
  inline bool operator==(const frac& s) const {
    if (b == s.b && b == 0) {
      return a == s.a;
    } else if (b == 0) {
      return 0;
    } else if (s.b == 0) {
      return 0;
    } else
      return a * s.b == b * s.a;
  }
  inline long double toDec() { return (long double)a / b; }
};
inline pair<frac, frac> getVec(pair<frac, frac> p1, pair<frac, frac> p2) {
  return {p2.first - p1.first, p2.second - p1.second};
}
const long double PI = acosl(0.0) * 2;
int n, sz = 0;
pair<frac, frac> c;
pair<frac, frac> ar[100001];
map<frac, pair<long long, long long> > mp;
multiset<long double> s;
int suc = 0;
inline int qry() {
  if (mp[frac(0, 0)].first) {
    return 1;
  } else if (suc) {
    return 2;
  } else {
    long double f = *s.begin();
    auto it = s.upper_bound(f + PI);
    if (it != s.end() && it != s.begin() && prev(it) != s.begin() &&
        *it - *prev(it) <= PI)
      return 3;
  }
  return 0;
}
inline void ins(pair<frac, frac> p) {
  ar[sz++] = p;
  p = getVec(c, p);
  int cur = 0;
  if (p.first.a > 0) {
    cur = 0;
  } else if (p.first.a < 0) {
    cur = 1;
  } else if (p.second.a >= 0) {
    cur = 0;
  } else {
    cur = 1;
  }
  if (cur) {
    mp[p.first / p.second].second++;
    if (mp[p.first / p.second].second == 1 &&
        mp[p.first / p.second].first > 0) {
      suc++;
    }
  } else {
    mp[p.first / p.second].first++;
    if (mp[p.first / p.second].first == 1 &&
        mp[p.first / p.second].second > 0) {
      suc++;
    }
  }
  s.insert(atan2l(p.second.toDec(), p.first.toDec()));
}
inline void del(pair<frac, frac> p) {
  p = getVec(c, p);
  int cur = 0;
  if (p.first.a > 0) {
    cur = 0;
  } else if (p.first.a < 0) {
    cur = 1;
  } else if (p.second.a >= 0) {
    cur = 0;
  } else {
    cur = 1;
  }
  if (cur) {
    mp[p.first / p.second].second--;
    if (mp[p.first / p.second].second == 0 &&
        mp[p.first / p.second].first > 0) {
      suc--;
    }
  } else {
    mp[p.first / p.second].first--;
    if (mp[p.first / p.second].first == 0 &&
        mp[p.first / p.second].second > 0) {
      suc--;
    }
  }
  s.erase(s.find(atan2l(p.second.toDec(), p.first.toDec())));
}
int main() {
  ios ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int x, y, z;
  cin >> x >> y >> z;
  c = make_pair(frac(x, x + y + z), frac(y, x + y + z));
  cin >> n;
  for (int i = 0; i < n; i++) {
    char q;
    cin >> q;
    if (q == 'A') {
      cin >> x >> y >> z;
      ins(make_pair(frac(x, x + y + z), frac(y, x + y + z)));
    } else {
      int k;
      cin >> k;
      del(ar[k - 1]);
    }
    cout << qry() << '\n';
  }
  return 0;
}
