#include<iostream>
using namespace std;
#define N 5
struct DBHandler {
int* arr;
DBHandler() {}
DBHandler(int* pArr) {
arr = pArr;
}
int Query(int k) {
return arr[k - 1];
}
};
// Find k'th smallest element of the two combind database entries
int findMedianofDatabaseHelper(DBHandler* db1, int i, DBHandler* db2, int j, const int n, int k) {
if((n - i) > (n - j))
{
return findMedianofDatabaseHelper(db2, j, db1, i, n, k);
}
if(i >= n)
{
return db2->Query(j + k);
}
if(j >= n)
{
return db1->Query(i + k);
}
if(k == 1)
{
return min(db1->Query(i + 1), db2->Query(j + 1));
}
int aMid = min(k / 2, n - i);
int bMid = k - aMid;
if(db1->Query(i + aMid) <= db2->Query(j + bMid))
{
return findMedianofDatabaseHelper(db1, i + aMid, db2, j, n, k - aMid);
}
return findMedianofDatabaseHelper(db1, i, db2, j + bMid, n, k - bMid);
}
// assuming DBHandler is a wrapper of database handler/instance on which we can perform query
int findMedianofDatabase(DBHandler* db1, DBHandler* db2, int n)
{
return findMedianofDatabaseHelper(db1, 0, db2, 0, n, n);
}
int main() {
int arr1[N] = {11, 13, 15, 17, 19};
int arr2[N] = {12, 14, 16, 18, 20};
DBHandler * db1 = new DBHandler(arr1);
DBHandler * db2 = new DBHandler(arr2);
cout << findMedianofDatabase(db1, db2, N) << endl; // output = 15
delete db1;
delete db2;
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBOIDUKCnN0cnVjdCBEQkhhbmRsZXIgewogICAgaW50KiBhcnI7CiAgICBEQkhhbmRsZXIoKSB7fQogICAgREJIYW5kbGVyKGludCogcEFycikgewogICAgICAgIGFyciA9IHBBcnI7CiAgICB9CiAgICBpbnQgUXVlcnkoaW50IGspIHsKICAgICAgICByZXR1cm4gYXJyW2sgLSAxXTsKICAgIH0KfTsKCi8vIEZpbmQgayd0aCBzbWFsbGVzdCBlbGVtZW50IG9mIHRoZSB0d28gY29tYmluZCBkYXRhYmFzZSBlbnRyaWVzCmludCBmaW5kTWVkaWFub2ZEYXRhYmFzZUhlbHBlcihEQkhhbmRsZXIqIGRiMSwgaW50IGksIERCSGFuZGxlciogZGIyLCBpbnQgaiwgY29uc3QgaW50IG4sIGludCBrKSB7CiAgICBpZigobiAtIGkpID4gKG4gLSBqKSkKICAgIHsKICAgICAgICByZXR1cm4gZmluZE1lZGlhbm9mRGF0YWJhc2VIZWxwZXIoZGIyLCBqLCBkYjEsIGksIG4sIGspOwogICAgfQogICAgaWYoaSA+PSBuKQogICAgewogICAgICAgIHJldHVybiBkYjItPlF1ZXJ5KGogKyBrKTsKICAgIH0KICAgIGlmKGogPj0gbikKICAgIHsKICAgICAgICByZXR1cm4gZGIxLT5RdWVyeShpICsgayk7CiAgICB9CiAgICBpZihrID09IDEpCiAgICB7CiAgICAgICAgcmV0dXJuIG1pbihkYjEtPlF1ZXJ5KGkgKyAxKSwgZGIyLT5RdWVyeShqICsgMSkpOwogICAgfQoKICAgIGludCBhTWlkID0gbWluKGsgLyAyLCBuIC0gaSk7CiAgICBpbnQgYk1pZCA9IGsgLSBhTWlkOwoKICAgIGlmKGRiMS0+UXVlcnkoaSArIGFNaWQpIDw9IGRiMi0+UXVlcnkoaiArIGJNaWQpKQogICAgewogICAgICAgIHJldHVybiBmaW5kTWVkaWFub2ZEYXRhYmFzZUhlbHBlcihkYjEsIGkgKyBhTWlkLCBkYjIsIGosIG4sIGsgLSBhTWlkKTsKICAgIH0KCiAgICByZXR1cm4gZmluZE1lZGlhbm9mRGF0YWJhc2VIZWxwZXIoZGIxLCBpLCBkYjIsIGogKyBiTWlkLCBuLCBrIC0gYk1pZCk7Cn0KCi8vIGFzc3VtaW5nIERCSGFuZGxlciBpcyBhIHdyYXBwZXIgb2YgZGF0YWJhc2UgaGFuZGxlci9pbnN0YW5jZSBvbiB3aGljaCB3ZSBjYW4gcGVyZm9ybSBxdWVyeQppbnQgZmluZE1lZGlhbm9mRGF0YWJhc2UoREJIYW5kbGVyKiBkYjEsIERCSGFuZGxlciogZGIyLCBpbnQgbikKewogICAgcmV0dXJuIGZpbmRNZWRpYW5vZkRhdGFiYXNlSGVscGVyKGRiMSwgMCwgZGIyLCAwLCBuLCBuKTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgYXJyMVtOXSA9IHsxMSwgMTMsIDE1LCAxNywgMTl9OwogICAgaW50IGFycjJbTl0gPSB7MTIsIDE0LCAxNiwgMTgsIDIwfTsKICAgIERCSGFuZGxlciAqIGRiMSA9IG5ldyBEQkhhbmRsZXIoYXJyMSk7CiAgICBEQkhhbmRsZXIgKiBkYjIgPSBuZXcgREJIYW5kbGVyKGFycjIpOwogICAgY291dCA8PCBmaW5kTWVkaWFub2ZEYXRhYmFzZShkYjEsIGRiMiwgTikgPDwgZW5kbDsgLy8gb3V0cHV0ID0gMTUKICAgIGRlbGV0ZSBkYjE7CiAgICBkZWxldGUgZGIyOwogICAgcmV0dXJuIDA7Cn0=