Cod sursa(job #3328552)

Utilizator sad_carrotVisan Sebastian sad_carrot Data 9 decembrie 2025 11:41:12
Problema Zeap Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.23 kb
#include <bits/stdc++.h>
using namespace std;

// Overload << for vector
template <typename S>
ostream &operator<<(ostream &os, const vector<S> &vector)
{
    for (auto i : vector)
        os << i << " ";
    os << "\n";
    return os;
}

struct Op
{
    int type, x;
    Op(int type, int x) : type(type), x(x) {}
};

ostream &operator<<(ostream &os, const Op &op)
{
    os << "(" << op.type << ", " << op.x << ")";
    return os;
}

struct Nod
{
    int max = 0, min = INT_MAX, mindif = INT_MAX;
};

ostream &operator<<(ostream &os, const Nod &node)
{
    os << "(" << node.max << ", " << node.min << ", " << node.mindif << ")";
    return os;
}

vector<Nod> aint(1'000'000);
vector<int> nums;

void ins(int node, int st, int dr, int x)
{
    if (st == dr)
    {
        aint[node].max = nums[st];
        aint[node].min = nums[st];
        return;
    }
    int mid = (st + dr) / 2;
    if (nums[mid] < x)
        ins(node * 2 + 2, mid + 1, dr, x);
    else
        ins(node * 2 + 1, st, mid, x);
    aint[node].max = max(aint[node * 2 + 1].max, aint[node * 2 + 2].max);
    aint[node].min = min(aint[node * 2 + 1].min, aint[node * 2 + 2].min);
    aint[node].mindif = min(aint[node * 2 + 1].mindif, aint[node * 2 + 2].mindif);
    if (aint[node * 2 + 2].min != INT_MAX && aint[node * 2 + 1].max != 0)
        aint[node].mindif = min(aint[node].mindif, aint[node * 2 + 2].min - aint[node * 2 + 1].max);
}

void del(int node, int st, int dr, int x)
{
    if (st == dr)
    {
        aint[node].max = 0;
        aint[node].min = INT_MAX;
        return;
    }
    int mid = (st + dr) / 2;
    if (nums[mid] < x)
        del(node * 2 + 2, mid + 1, dr, x);
    else
        del(node * 2 + 1, st, mid, x);
    aint[node].max = max(aint[node * 2 + 1].max, aint[node * 2 + 2].max);
    aint[node].min = min(aint[node * 2 + 1].min, aint[node * 2 + 2].min);
    aint[node].mindif = min(aint[node * 2 + 1].mindif, aint[node * 2 + 2].mindif);
    if (aint[node * 2 + 2].min != INT_MAX && aint[node * 2 + 1].max != 0)
        aint[node].mindif = min(aint[node].mindif, aint[node * 2 + 2].min - aint[node * 2 + 1].max);
}

int main()
{
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    // ios_base::sync_with_stdio(false);
    // f.tie(NULL);
    char t;
    int x;
    vector<Op> ops;
    unordered_set<int> nums_set;
    while (f >> t)
    {
        if (t == 'I')
        {
            f >> x;
            ops.push_back(Op(0, x));
            nums_set.insert(x);
        }
        else if (t == 'S')
        {
            f >> x;
            ops.push_back(Op(1, x));
        }
        else if (t == 'C')
        {
            f >> x;
            ops.push_back(Op(2, x));
        }
        else
        {
            f >> t >> t;
            if (t == 'X')
                ops.push_back(Op(3, 0));
            else
                ops.push_back(Op(4, 0));
        }
    }
    nums = vector<int>(nums_set.begin(), nums_set.end());
    int n = nums.size() - 1;
    sort(nums.begin(), nums.end());
    // aint = vector<Nod>(n * 2 + 10);
    nums_set.clear();
    for (auto &op : ops)
    {
        switch (op.type)
        {
        case 0:
        {
            // Insert
            if (nums_set.find(op.x) == nums_set.end())
            {
                ins(0, 0, n, op.x);
                nums_set.insert(op.x);
            }
            break;
        }
        case 1:
        {
            // Delete
            if (nums_set.find(op.x) == nums_set.end())
            {
                g << -1 << "\n";
            }
            else
            {
                del(0, 0, n, op.x);
                nums_set.erase(op.x);
            }
            break;
        }
        case 2:
        {
            // Search
            if (nums_set.find(op.x) == nums_set.end())
                g << 0 << "\n";
            else
                g << 1 << "\n";
            break;
        }
        case 3:
        {
            // Max-Dif
            if (nums.size() < 2)
                g << -1 << "\n";
            else
                g << aint[0].max - aint[0].min << "\n";
            break;
        }
        case 4:
        {
            // Min-Dif
            if (nums.size() < 2)
                g << -1 << "\n";
            else
                g << aint[0].mindif << "\n";
            break;
        }
        }
    }
    return 0;
}