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

template<class T>
void func(const T& a, const T& b) {
	for(auto x : a) {
		cout << x << " ";
	}
	cout << endl;
	for(auto x : b) {
		cout << x << " ";
	}
}

template<typename Iterator>
struct range { Iterator begin_, end_; };

template<typename T>
T begin(const range<T>& ar) { return ar.begin_; }

template<typename T>
T end(const range<T>& ar) { return ar.end_; }

template<typename T, size_t N>
range<T*> make_array_range(T (&array)[N])
{
     using std::begin; using std::end;
     return { begin(array), end(array) };
}

template<class T, size_t M, size_t N>
void func(const T (&a)[M], const T (&b)[N]) {
	func(make_array_range(a), make_array_range(b));
}

int main() {
	int a1[] = {1, 2};
	int a2[] = {3, 4, 5};
	func(a1, a2);
	return 0;
}