#include <iostream>
#include <iterator>
#include <vector>

template <class Input1, class Input2,
            class Output1, class Output2, class Output3>
Output3 decompose_sets(Input1 first1, Input1 last1,
                    Input2 first2, Input2 last2,
                    Output1 result1, Output2 result2,
                    Output3 result3)
{
    while (first1 != last1 && first2 != last2) {
        if (*first1 < *first2) {
            *result1++ = *first1++;
        } else if (*first2 < *first1) {
            *result2++ = *first2++;
        } else {
            *result3++ = *first1++;
            ++first2; // skip common value in set2
        }
    }
    std::copy(first1, last1, result1);
    std::copy(first2, last2, result2);
    return result3;
}

int main()
{
    int data1[] = { 0, 2, 3, 4, 5, 7, 8, 9 };
    int data2[] = { 1, 2, 4, 6, 8, 10 };
    std::vector<int> one, two, three;

    decompose_sets(
        std::begin(data1), std::end(data1),
        std::begin(data2), std::end(data2),
        back_inserter(one),
        back_inserter(two),
        back_inserter(three)
        );

    for (auto value : one) {
        std::cout << value << ' ';
    }
    std::cout << '\n';
    for (auto value : two) {
        std::cout << value << ' ';
    }
    std::cout << '\n';
    for (auto value : three) {
        std::cout << value << ' ';
    }
    std::cout << '\n';
}
