#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';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXQxLCBjbGFzcyBJbnB1dDIsCiAgICAgICAgICAgIGNsYXNzIE91dHB1dDEsIGNsYXNzIE91dHB1dDIsIGNsYXNzIE91dHB1dDM+Ck91dHB1dDMgZGVjb21wb3NlX3NldHMoSW5wdXQxIGZpcnN0MSwgSW5wdXQxIGxhc3QxLAogICAgICAgICAgICAgICAgICAgIElucHV0MiBmaXJzdDIsIElucHV0MiBsYXN0MiwKICAgICAgICAgICAgICAgICAgICBPdXRwdXQxIHJlc3VsdDEsIE91dHB1dDIgcmVzdWx0MiwKICAgICAgICAgICAgICAgICAgICBPdXRwdXQzIHJlc3VsdDMpCnsKICAgIHdoaWxlIChmaXJzdDEgIT0gbGFzdDEgJiYgZmlyc3QyICE9IGxhc3QyKSB7CiAgICAgICAgaWYgKCpmaXJzdDEgPCAqZmlyc3QyKSB7CiAgICAgICAgICAgICpyZXN1bHQxKysgPSAqZmlyc3QxKys7CiAgICAgICAgfSBlbHNlIGlmICgqZmlyc3QyIDwgKmZpcnN0MSkgewogICAgICAgICAgICAqcmVzdWx0MisrID0gKmZpcnN0MisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICpyZXN1bHQzKysgPSAqZmlyc3QxKys7CiAgICAgICAgICAgICsrZmlyc3QyOyAvLyBza2lwIGNvbW1vbiB2YWx1ZSBpbiBzZXQyCiAgICAgICAgfQogICAgfQogICAgc3RkOjpjb3B5KGZpcnN0MSwgbGFzdDEsIHJlc3VsdDEpOwogICAgc3RkOjpjb3B5KGZpcnN0MiwgbGFzdDIsIHJlc3VsdDIpOwogICAgcmV0dXJuIHJlc3VsdDM7Cn0KCmludCBtYWluKCkKewogICAgaW50IGRhdGExW10gPSB7IDAsIDIsIDMsIDQsIDUsIDcsIDgsIDkgfTsKICAgIGludCBkYXRhMltdID0geyAxLCAyLCA0LCA2LCA4LCAxMCB9OwogICAgc3RkOjp2ZWN0b3I8aW50PiBvbmUsIHR3bywgdGhyZWU7CgogICAgZGVjb21wb3NlX3NldHMoCiAgICAgICAgc3RkOjpiZWdpbihkYXRhMSksIHN0ZDo6ZW5kKGRhdGExKSwKICAgICAgICBzdGQ6OmJlZ2luKGRhdGEyKSwgc3RkOjplbmQoZGF0YTIpLAogICAgICAgIGJhY2tfaW5zZXJ0ZXIob25lKSwKICAgICAgICBiYWNrX2luc2VydGVyKHR3byksCiAgICAgICAgYmFja19pbnNlcnRlcih0aHJlZSkKICAgICAgICApOwoKICAgIGZvciAoYXV0byB2YWx1ZSA6IG9uZSkgewogICAgICAgIHN0ZDo6Y291dCA8PCB2YWx1ZSA8PCAnICc7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgJ1xuJzsKICAgIGZvciAoYXV0byB2YWx1ZSA6IHR3bykgewogICAgICAgIHN0ZDo6Y291dCA8PCB2YWx1ZSA8PCAnICc7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgJ1xuJzsKICAgIGZvciAoYXV0byB2YWx1ZSA6IHRocmVlKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHZhbHVlIDw8ICcgJzsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCAnXG4nOwp9Cg==