Cod sursa(job #2148163)

Utilizator retrogradLucian Bicsi retrograd Data 1 martie 2018 16:03:44
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>

using namespace std;

const int kMin = 0;
const int kMax = 2e9 + 1;

class CuteTree {
    struct Node { int val, l, r; };
    vector<Node> T = {{0, 0, 0}};
    int root = 0;
    
    int insert(int cur, int b, int e, int upd) {
        if (cur == 0) return upd;
        if (T[cur].val == T[upd].val) return cur;
        assert(b <= e);

        int m = b + (e - b) / 2;
        if (T[upd].val == m) swap(T[upd].val, T[cur].val);
        if (T[upd].val < m) T[cur].l = insert(T[cur].l, b, m - 1, upd);
        else T[cur].r = insert(T[cur].r, m + 1, e, upd);
        return cur;
    }

    int join(int node1, int node2, int b, int e, int val) {
        if (node1 == 0) return node2;
        if (node2 == 0) return node1;
        int m = b + (e - b) / 2;
        if (val < m) {
            T[node2].l = join(node1, T[node2].l, b, m - 1, val);
            return node2;
        }
        else {
            T[node1].r = join(T[node1].r, node2, m + 1, e, val);
            return node1;
        }
    }
    int erase(int node, int b, int e, int val) {
        if (node == 0) return 0;
        if (T[node].val == val)
            return join(T[node].l, T[node].r, b, e, val);
        
        int m = b + (e - b) / 2;
        if (val == m) return node;
        if (val < m) T[node].l = erase(T[node].l, b, m - 1, val);
        else T[node].r = erase(T[node].r, m + 1, e, val);
        return node;
    }
    bool find(int node, int b, int e, int val) {
         if (node == 0) return false;
         if (T[node].val == val) return node;

         int m = b + (e - b) / 2;
         if (val == m) return false;
         if (val < m) return find(T[node].l, b, m - 1, val);
         return find(T[node].r, m + 1, e, val);
    }

public:   
    bool Contains(int val) {
        return find(root, kMin, kMax, val) != 0;
    } 
    void Erase(int val) {
        root = erase(root, kMin, kMax, val);
    }
    void Insert(int val) { 
        T.push_back({val, 0, 0});
        root = insert(root, kMin, kMax, T.size() - 1); 
    }
};

int main() {
    ifstream cin("hashuri.in");
    ofstream cout("hashuri.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int n; cin >> n;
    CuteTree qt;
    for (int i = 0; i < n; ++i) {
        int t, x; cin >> t >> x;
        if (t == 1) { qt.Insert(x); }
        if (t == 2) { qt.Erase(x); }
        if (t == 3) { cout << qt.Contains(x) << '\n'; }
    }    
}