func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T1, typename T2>   inline void chkmin(T1& a, T2 b) {     if (a > b) a = b;   }   template <typename T1, typename T2>   inline void chkmax(T1& a, T2 b) {     if (a < b) a = b;   }   using ll = long long;   using d = double;   using ld = long double;   const string FILENAME =  input ;   const int MAXN = 200228;   const d eps = 1e-15;   __int128 gcd(__int128 a, __int128 b) {     while (b) {       a %= b;       swap(a, b);     }     return a;   }   __int128 mabs(__int128 a) { return (a >= 0 ? a : -a); }   struct Ratio {     __int128 p, q;     Ratio() {}     Ratio(__int128 a, __int128 b) {       p = a;       q = b;       auto d = mabs(gcd(p, q));       if (d != 0) {         p /= d;         q /= d;       }       if (q < 0) {         p = -p;         q = -q;       }     }   };   void norm(Ratio& a) {     auto d = mabs(gcd(a.p, a.q));     if (d != 0) {       a.p /= d;       a.q /= d;     }     if (a.q < 0) {       a.p = -a.p;       a.q = -a.q;     }     if (a.p == 0 && a.q != 0) {       a.q = 1;     }   }   bool operator==(const Ratio& a, const Ratio& b) {     return a.p == b.p && a.q == b.q;   }   bool operator<(const Ratio& a, const Ratio& b) { return a.p * b.q < b.p * a.q; }   Ratio operator+(const Ratio& a, const Ratio& b) {     Ratio c;     c.q = a.q * b.q;     c.p = a.p * b.q + b.p * a.q;     norm(c);     return c;   }   Ratio operator-(const Ratio& a, const Ratio& b) {     Ratio c;     c.q = a.q * b.q;     c.p = a.p * b.q - b.p * a.q;     norm(c);     return c;   }   Ratio operator*(const Ratio& a, const Ratio& b) {     Ratio c;     c.p = a.p * b.p;     c.q = a.q * b.q;     norm(c);     return c;   }   Ratio operator/(const Ratio& a, const Ratio& b) {     Ratio c;     c.p = a.p * b.q;     c.q = a.q * b.p;     norm(c);     return c;   }   struct Point {     Ratio x, y;     Point() {}     Point(Ratio _x, Ratio _y) {       x = _x;       y = _y;     }   };   bool operator==(const Point& a, const Point& b) {     return a.x == b.x && a.y == b.y;   }   bool operator<(const Point& a, const Point& b) {     return make_pair(a.x, a.y) < make_pair(b.x, b.y);   }   Point operator-(const Point& a, const Point& b) {     return Point(a.x - b.x, a.y - b.y);   }   Point createPoint(ll a, ll b, ll c) {     Point res(Ratio(a, a + b + c), Ratio(b, a + b + c));     return res;   }   int n;   Point p[MAXN];   ll cnt1 = 0;   Point target;   map<Point, int> kek;   map<Point, int> cntr;   void print(Point pp) {     cout << (ll)pp.x.p <<  /  << (ll)pp.x.q <<     << (ll)pp.y.p <<  /           << (ll)pp.y.q << endl;   }   Ratio vec(const Point& a, const Point& b) { return a.x * b.y - a.y * b.x; }   int check(Point a, Point b) {     if (a == b) {       return 0;     }     return vec(a, b).p < 0;   }   struct event {     Point a;     event() {}     event(Point _a) { a = _a; }   };   Ratio len(Point a) { return a.x * a.x + a.y * a.y; }   bool operator==(const event& a, const event& b) { return a.a == b.a; }   int getHalf(Point a) { return a.y.p > 0 || (a.y.p == 0 && a.x.p > 0); }   bool operator<(const event& a, const event& b) {     int t = getHalf(a.a);     int t1 = getHalf(b.a);     if (t != t1) {       return t > t1;     }     if (a.a == b.a) {       return false;     }     Ratio s = vec(a.a, b.a);     if (s.p == 0) {       return len(a.a) < len(b.a);     } else {       return s.p > 0;     }   }   multiset<event> st;   int cntk = 0;   Point getRight(Point x) {     auto f = st.upper_bound(event(x));     if (f == st.end()) {       f = st.begin();     }     return (*f).a;   }   Point getLeft(Point x) {     auto f = st.lower_bound(event(x));     if (f == st.begin()) {       f = st.end();     }     f--;     return (*f).a;   }   void norm(Point& a) {     if (a.x.p == 0) {       a.x.p = 0;       a.x.q = 1;       int c = (a.y.p > 0 ? 1 : -1);       a.y.p = c;       a.y.q = 1;     } else if (a.y.p == 0) {       a.y.p = 0;       a.y.q = 1;       int c = (a.x.p > 0 ? 1 : -1);       a.x.p = c;       a.x.q = 1;     } else {       a.x.p *= a.y.q;       a.y.p *= a.x.q;       a.x.q = 1;       a.y.q = 1;       auto d = mabs(gcd(a.x.p, a.y.p));       a.x.p /= d;       a.y.p /= d;     }   }   map<Point, int> cntf;   void add(Point t) {     if (t == target) {       return;     }     t = t - target;     norm(t);     cntf[t]++;     if (cntf[t] == 1) {       auto t1 = event(t);       if ((int)(st).size() == 0) {         st.insert(t1);       } else {         auto f = getLeft(t);         auto f1 = getRight(t);         cntk -= check(f, f1);         cntk += check(f, t);         cntk += check(t, f1);         st.insert(t1);       }     }   }   void del(Point t) {     if (t == target) {       return;     }     t = t - target;     norm(t);     cntf[t]--;     if (cntf[t] == 0) {       auto t1 = event(t);       st.erase(st.find(t1));       if (st.empty()) {         return;       }       auto f = getLeft(t);       auto f1 = getRight(t);       cntk += check(f, f1);       cntk -= check(f, t);       cntk -= check(t, f1);     }   }   void proceedBich(int id) {     Point x = p[id] - target;     norm(x);     Point x1 = x;     x1.x.p *= -1;     x1.y.p *= -1;     cnt1 += cntr[x1];     cntr[x]++;   }   void proceedBich1(int id) {     Point x = p[id] - target;     norm(x);     Point x1 = x;     x1.x.p *= -1;     x1.y.p *= -1;     cntr[x]--;     cnt1 -= cntr[x1];   }   void addPoint(int id) {     kek[p[id]]++;     proceedBich(id);     add(p[id]);   }   void delPoint(int id) {     kek[p[id]]--;     proceedBich1(id);     del(p[id]);   }   int check() {     if (kek[target]) {       return 1;     }     if (cnt1) {       return 2;     }     if (cntk == 0) {       if ((int)(st).size() >= 3) {         return 3;       }     }     return 0;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     int ss, pp, gg;     cin >> ss >> pp >> gg;     target = createPoint(ss, pp, gg);     cin >> n;     int uk = 0;     for (int it = 0; it < n; it++) {       char c;       cin >> c;       if (c ==  A ) {         int ph, pg, pd;         cin >> ph >> pg >> pd;         p[uk] = createPoint(ph, pg, pd);         addPoint(uk);         uk++;       } else if (c ==  R ) {         int id;         cin >> id;         id--;         delPoint(id);       }       cout << check() <<   n ;     }   }   