#include <iostream>
#include <algorithm>
#include <vector>

class Set {
 public:
    Set();

    explicit Set(const std::vector<int64_t> &elements) : elements(elements) {
    }

    void Add(int64_t new_element) {
        if (!this->Contains(new_element)) {
            elements.push_back(new_element);
            std::sort(elements.begin(), elements.end());
        }
    }

    void Remove(int64_t old_element) {
        auto it = std::find(elements.begin(), elements.end(), old_element);
        elements.erase(it);
    }

    bool Contains(int64_t element) const {
        for (const auto &item : elements) {
            if (item == element) {
                return true;
            }
        }
        return false;
    }

    Set Union(const Set &second_set) const {
        Set new_set(elements);
        for (const auto &item : second_set.Data()) {
            if (!new_set.Contains(item)) {
                new_set.Add(item);
            }
        }
        return new_set;
    }

    Set Intersection(const Set &second_set) const {
        Set new_set;
        for (auto &item : elements) {
            if (second_set.Contains(item)) {
                new_set.Add(item);
            }
        }
        return new_set;
    }

    Set Difference(const Set &second_set) const {
        Set new_set;
        for (auto &item : elements) {
            if (!second_set.Contains(item)) {
                new_set.Add(item);
            }
        }
        return new_set;
    }

    Set SymmetricDifference(const Set &second_set) const {
        Set new_set;
        Set A;
        Set B;
        A = this->Difference(second_set);
        B = second_set.Difference(*this);
        new_set = A.Union(B);
        return new_set;
    }

    std::vector<int64_t> Data() const {
        return elements;
    }

 private:
    std::vector<int64_t> elements;
};