#ifndef SET_SET_H
#define SET_SET_H
#pragma once
#include <vector>
#include <cstdint>
#include <algorithm>

class Set {
 private:
    std::vector<int64_t> set;
 public:
    explicit Set(const std::vector<int64_t>&s = {}) {
        for (int64_t k : s) {
            if (std::find(set.begin(), set.end(), k) == set.end()) {
                set.push_back(k);
                sort(set.begin(), set.end());
            }
        }
    }
    std::vector<int64_t> Data() const {
        return set;
    }
    Set Union(const Set&) const;
    Set Intersection(const Set&) const;
    Set Difference(const Set&) const;
    Set SymmetricDifference(const Set&) const;
    void Add(int64_t);
    void Remove(int64_t);
    bool Contains(int64_t) const;
};

Set Set::Union(const Set &other) const {
    Set NewSet;
    for (auto i : set)
        NewSet.Add(i);
    for (auto i : other.set)
        NewSet.Add(i);
    return NewSet;
}

Set Set::Intersection(const Set &other) const {
    Set NewSet;
    for (auto i : set) {
        if (std::find(other.set.begin(), other.set.end(), i) != other.set.end())
            NewSet.Add(i);
    }
    return NewSet;
}

Set Set::Difference(const Set& s) const {
    Set NewSet;
    for (int64_t k : set) {
        if (!(std::find(s.set.begin(), s.set.end(), k) != s.set.end())) {
            NewSet.Add(k);
        }
    }
    return NewSet;
}

Set Set::SymmetricDifference(const Set& s) const {
    Set NewSet;
    for (int64_t k : s.set) {
        if (!(std::find(set.begin(), set.end(), k) != set.end())) {
            NewSet.Add(k);
        }
    }
    for (int64_t k : set) {
        if (!(std::find(s.set.begin(), s.set.end(), k) != s.set.end())) {
            NewSet.Add(k);
        }
    }
    return NewSet;
}

void Set::Add(int64_t num) {
    if (std::find(set.begin(), set.end(), num) == set.end()) {
        set.push_back(num);
        sort(set.begin(), set.end());
    }
}

void Set::Remove(int64_t num) {
    auto it = std::find(set.begin(), set.end(), num);
    if (it != set.end())
        set.erase(it);
}

bool Set::Contains(int64_t num) const {
    return std::find(set.begin(), set.end(), num) != set.end();
}

#endif