#include <iostream>
#include <vector>
using namespace std;

typedef pair<vector<int>, vector<int>> pvivi;

pvivi findMissingAndDup(int a[], int len) {
	vector<int> missing, dup;
	for (int i = 0; i < len; i++) {
		while (a[a[i]] != a[i])
			swap(a[i], a[a[i]]);
	}

	for (int i = 0; i < len; i++) {
		if (a[i] != i) {
			missing.push_back(i);
			dup.push_back(a[i]);
		}
	}
	return make_pair(missing, dup);
}

int main() {
	int a[] = {0, 5, 3, 3, 4, 5};
	pvivi p = findMissingAndDup(a, sizeof(a)/sizeof(a[0]));
	vector<int> vm = p.first;
	vector<int> vd = p.second;
	cout << "Missing: ";
	for (int i:vm) cout<<i<<" ";
	cout << "\nDup: ";
	for (int i:vd) cout<<i<<" ";
	// your code goes here
	return 0;
}