#include <vector>
#include <set>
#include <cstdint>

#ifndef SET_SET_H
#define SET_SET_H

class Set {
 public:
    std::set<int64_t> objSet;

    explicit Set(const std::vector<int64_t> &vect) {
        for (int64_t i : vect) {
            this->objSet.insert(i);
        }
    }

    Set() = default;

    void Add(int64_t num) {
        this->objSet.insert(num);
    }

    void Remove(int64_t num) {
        this->objSet.erase(num);
    }

    bool Contains(int64_t num) const {
        if (this->objSet.find(num) == this->objSet.end()) {
            return false;
        } else {
            return true;
        }
    }

    Set Union(const Set &s) const {
        Set resObj;
        for (int64_t el : this->objSet) {
            resObj.Add(el);
        }
        for (int64_t el : s.objSet) {
            resObj.Add(el);
        }
        return resObj;
    }

    Set Intersection(const Set &s) const {
        Set resObj;
        for (int64_t el : this->objSet) {
            if (s.Contains(el)) {
                resObj.Add(el);
            }
        }
        return resObj;
    }

    Set Difference(const Set &s) const {
        Set resObj;
        for (int64_t el : this->objSet) {
            if (!s.Contains(el)) {
                resObj.Add(el);
            }
        }
        return resObj;
    }

    Set SymmetricDifference(const Set &s) const {
        Set resObj;
        for (int64_t el : this->objSet) {
            if (!s.Contains(el)) {
                resObj.Add(el);
            }
        }
        for (int64_t el : s.objSet) {
            if (!this->Contains(el)) {
                resObj.Add(el);
            }
        }
        return resObj;
    }

    std::vector<int64_t> Data() const {
        std::vector<int64_t> res;
        for (int64_t el : this->objSet) {
            res.push_back(el);
        }
        return res;
    }

};

#endif  // SET_SET_H