Submission #1262083

#TimeUsernameProblemLanguageResultExecution timeMemory
1262083inkvizytorMixture (BOI20_mixture)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

class mojset {
private:
    multiset<double> angles;
    multiset<double> gaps;

    static double dist(double a, double b) {
        if (b >= a) return b - a;
        return M_PI*2 - a + b;
    }

public:
    void add(double angle) {
        if (angles.count(angle)) {
            angles.insert(angle);
            return;
        }

        if (angles.empty()) {
            angles.insert(angle);
            return;
        }

        auto it = angles.lower_bound(angle);
        auto nxt = (it == angles.end() ? angles.begin() : it);
        auto prv = (it == angles.begin() ? prev(angles.end()) : prev(it));
        auto x = gaps.find(dist(*prv, *nxt));
        if (x != gaps.end()) {
            gaps.erase(x);
        } 

        gaps.insert(dist(*prv, angle));
        gaps.insert(dist(angle, *nxt));

        angles.insert(angle);
    }

    void remove(double angle) {
        auto it = angles.find(angle);
        if (it == angles.end()) return;

        if (angles.size() == 1 || angles.count(angle)) {
            angles.erase(it);
            return;
        }

        auto nxt = next(it);
        if (nxt == angles.end()) nxt = angles.begin();
        auto prv = (it == angles.begin() ? prev(angles.end()) : prev(it));

        gaps.erase(gaps.find(dist(*prv, angle)));
        gaps.erase(gaps.find(dist(angle, *nxt)));

        gaps.insert(dist(*prv, *nxt));

        angles.erase(it);
    }

    double maxGap() const {
        if (angles.size() < 2) return M_PI*2;
        return *gaps.rbegin();
    }
};


ll sqlen(ll x, ll y, ll z) {
    return x*x+y*y+z*z;
}

ll dot(ll x, ll y, ll z, ll a, ll b, ll c) {
    return x*a+y*b+z*c;
}

pair<ll, ll> conv(ll x, ll y, ll z, ll a, ll b, ll c) {
    ll l = sqlen(a, b, c);
    ll d = dot(x, y, z, a, b, c);
    return {x*l-a*d, y*l-b*d}; 
}

void wyn(int i1, int i2, mojset &s) {
    if (i1) {
        cout << 1 << '\n';
        return;
    }
    if (i2) {
        cout << 2 << '\n';
        return;
    }
    if (s.maxGap() < M_PI) {
        cout << 3 << '\n';
        return;
    }
    cout << 0 << '\n';
}

ll nwd(ll a, ll b) {
    if (a==b && a==0){
        return 1;
    }
    if (a < b) {
        swap(a, b);
    }
    if (b == 0) {
        return a;
    }
    return nwd(b, a%b);
}

int main() {
	ios::sync_with_stdio(0); 
    cin.tie(0);
    ll a, b, c;
    cin >> a >> b >> c;
    ll n;
	cin >> n;
    vector<pair<ll, pair<ll, ll>>> w = {{0, {0, 0}}};
    mojset s;
    int ile1 = 0;
    int ile2 = 0;
    map<pair<ll, ll>, int> mp;
    for (int i = 0; i < n; i++) {
        char q;
        cin >> q;
        if (q == 'A') {
            ll x, y, z;
            cin >> x >> y >> z;
            pair<ll ,ll> p = conv(x, y, z, a, b, c);
            ll d = nwd(abs(p.first), abs(p.second));
            p.first /= d;
            p.second /= d;
            w.push_back({0, p});
            if (p.first == 0 && p.second==0) {
                ile1++;
            }
            mp[p]++;
            if (mp[{-p.first, -p.second}] && (mp[p]==1)) {
                ile2++;
            }
            if (sqlen(p.first, p.second, 0) != 0) {
                double k = (double)p.first/sqrt(sqlen(p.first, p.second, 0));
                double k1 = acos(k);
                if (p.second < 0) {
                    k1 = M_PI*2-k1;
                }
                w[w.size()-1].first = k1;
                s.add(k1);
            }
            wyn(ile1, ile2, s);
        }
        else {
            int j;
            cin >> j;
            pair<ll, ll> p = w[j].second;
            if (p.first == 0 && p.second==0) {
                ile1--;
            }
            mp[p]--;
            if (mp[{-p.first, -p.second}] && (mp[p]==0)) {
                ile2--;
            }
            if (sqlen(p.first, p.second, 0) != 0) {
                double k = w[j].first;
                s.remove(k);
            }
            wyn(ile1, ile2, s);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...