#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKbmFtZXNwYWNlIG1qIHsKdm9pZCBtZXJnZShpbnQgKkEsIGludCAqQiwgaW50ICptYXBBLCBpbnQgKm1hcEIsIGludCAqTUEsIGludCBNLCBpbnQgTikKewoJaW50IGkgPSAwLCBqID0gMDsKCXdoaWxlKGkgPCBNICYmIGogPCBOKSB7CgkgICAgaWYoQVtpXSA8IEJbal0pIHsKCSAgICAgICAgTUFbaStqXSA9IEFbaV07CgkgICAgICAgIG1hcEFbaStqXSA9IGk7CgkgICAgICAgIGkrKzsKCSAgICB9IGVsc2UgewoJICAgICAgICBNQVtpK2pdID0gQltqXTsKCSAgICAgICAgbWFwQltpK2pdID0gajsKCSAgICAgICAgaisrOwoJICAgIH0KCX0KCXdoaWxlKGkgPCBNKSB7CgkgICAgTUFbaStqXSA9IEFbaV07CgkgICAgbWFwQVtpK2pdID0gaTsKCSAgICBpKys7Cgl9Cgl3aGlsZShqIDwgTikgewoJICAgIE1BW2kral0gPSBCW2pdOwoJICAgIG1hcEJbaStqXSA9IGo7CgkgICAgaisrOwoJfQp9Cgp2b2lkIHNlYXJjaChpbnQgKm1hcEEsIGludCAqbWFwQiwgaW50ICpNQSwgaW50IE0sIGludCBOLCBpbnQgYW5zd2VyKQp7CglpbnQgaSA9IDA7CglpbnQgaiA9IE4gKyBNIC0gMTsKCXdoaWxlKGkgPCBqKXsKCSAgIGlmKG1hcEFbaV0gPT0gLTEpIGkrKzsKCSAgIGVsc2UgaWYobWFwQltqXSA9PSAtMSkgai0tOwoJICAgZWxzZSBpZiAoTUFbaV0gKyBNQVtqXSA9PSBhbnN3ZXIpIHsKCSAgIAkJY291dCA8PCAiQVsiIDw8IG1hcEFbaV0gPDwgIl0gKyBCWyIgPDwgbWFwQltqXSA8PCAiXSA9ICIgPDwgTUFbaV0gPDwgIiArICIgPDwgTUFbal0gPDwgIiA9ICIgPDwgYW5zd2VyIDw8IGVuZGw7CgkgICAJCXJldHVybjsKCSAgIH0gZWxzZSBpZiAoTUFbaV0gKyBNQVtqXSA8ICBhbnN3ZXIpIGkrKzsKCSAgIGVsc2UgaWYgKE1BW2ldICsgTUFbal0gPiAgYW5zd2VyKSBqLS07Cgl9Cgljb3V0IDw8IGFuc3dlciA8PCAiIG5vdCBmb3VuZCIgPDwgZW5kbDsKfQoKfQoKaW50IG1haW4oKSB7CglpbnQgQVtdID0gezEsMiwzLDQsNX07CglpbnQgQltdID0gezYsIDcsIDgsIDksIDEwfTsgLy8gQXNzdW1pbmcgYm90aCBhcmUgc29ydGVkCgljb25zdCBpbnQgTSA9IHNpemVvZiBBIC8gc2l6ZW9mIEFbMF07Cgljb25zdCBpbnQgTiA9IHNpemVvZiBCIC8gc2l6ZW9mIEJbMF07CglpbnQgTUFbTStOXSwgbWFwQVtNK05dLCBtYXBCW00rTl07CgkKCWZpbGwobWFwQSwgbWFwQSArIE0gKyBOLCAtMSk7CglmaWxsKG1hcEIsIG1hcEIgKyBNICsgTiwgLTEpOwoJbWo6Om1lcmdlKEEsIEIsIG1hcEEsIG1hcEIsIE1BLCBNLCBOKTsKCiAgICBtajo6c2VhcmNoKG1hcEEsIG1hcEIsIE1BLCBNLCBOLCAxMyk7CiAgICBtajo6c2VhcmNoKG1hcEEsIG1hcEIsIE1BLCBNLCBOLCAxNik7CgoJcmV0dXJuIDA7Cn0=