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

namespace mj {
void merge(int *A, int *B, int *mapA, int *mapB, int *MA, int M, int N)
{
	int i = 0, j = 0;
	while(i < M && j < N) {
	    if(A[i] < B[j]) {
	        MA[i+j] = A[i];
	        mapA[i+j] = i;
	        i++;
	    } else {
	        MA[i+j] = B[j];
	        mapB[i+j] = j;
	        j++;
	    }
	}
	while(i < M) {
	    MA[i+j] = A[i];
	    mapA[i+j] = i;
	    i++;
	}
	while(j < N) {
	    MA[i+j] = B[j];
	    mapB[i+j] = j;
	    j++;
	}
}

void search(int *mapA, int *mapB, int *MA, int M, int N, int answer)
{
	int i = 0;
	int j = N + M - 1;
	while(i < j){
	   if(mapA[i] == -1) i++;
	   else if(mapB[j] == -1) j--;
	   else if (MA[i] + MA[j] == answer) {
	   		cout << "A[" << mapA[i] << "] + B[" << mapB[j] << "] = " << MA[i] << " + " << MA[j] << " = " << answer << endl;
	   		return;
	   } else if (MA[i] + MA[j] <  answer) i++;
	   else if (MA[i] + MA[j] >  answer) j--;
	}
	cout << answer << " not found" << endl;
}

}

int main() {
	int A[] = {1,2,3,4,5};
	int B[] = {6, 7, 8, 9, 10}; // Assuming both are sorted
	const int M = sizeof A / sizeof A[0];
	const int N = sizeof B / sizeof B[0];
	int MA[M+N], mapA[M+N], mapB[M+N];
	
	fill(mapA, mapA + M + N, -1);
	fill(mapB, mapB + M + N, -1);
	mj::merge(A, B, mapA, mapB, MA, M, N);

    mj::search(mapA, mapB, MA, M, N, 13);
    mj::search(mapA, mapB, MA, M, N, 16);

	return 0;
}