/**
* @brief Search for Magic Index hence an array index where
* a[i]==i
*/
#include <iostream>
#include <array>
#include <assert.h>
using namespace std;
array<int, 11> data = {-40, -20, -1, 1,2,3,5,7,9,12,15};
template <typename T>
class MaybeResult
{
public:
MaybeResult(const T& _val) : is_valid(true), val(_val) {}
MaybeResult() : is_valid(false), val() {}
const bool is_valid;
const T val;
};
template <typename T>
MaybeResult<unsigned int> find_magic_index(const T& arr, const unsigned int l, const unsigned int r)
{
if(r<l) return MaybeResult<unsigned int>();
if(l==r) return (arr[r]==r)?MaybeResult<unsigned int>(r):MaybeResult<unsigned int>();
const unsigned int p = (l+r)/2;
if(arr[p]==p) return MaybeResult<unsigned int>(p);
if(arr[p] > p) return find_magic_index(arr, l, p);
if(arr[p] < p) return (p>l)?find_magic_index(arr, p, r):find_magic_index(arr, r, r);
return MaybeResult<unsigned int>();
}
int main() {
std::cout << "Hello World!\n";
assert(find_magic_index(array<int, 11>{-40, -20, -1, 1,2,3,5,7,9,12,15}, 0, data.size()-1).val == 7 );
assert(find_magic_index(array<int, 11>{-40, -20, -1, 1,2,3,5,6,9,12,15}, 0, data.size()-1).is_valid == false );
auto res = find_magic_index(array<int, 11>{-40, -20, -1, 1,2,3,5,7,9,12,15}, 0, data.size()-1);
cout << (res.is_valid?to_string(res.val):"Not Found") << endl;
}
LyoqCiAgKiBAYnJpZWYgU2VhcmNoIGZvciBNYWdpYyBJbmRleCBoZW5jZSBhbiBhcnJheSBpbmRleCB3aGVyZSAKICAqIGFbaV09PWkgCiAgKi8KCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8YXNzZXJ0Lmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKYXJyYXk8aW50LCAxMT4gZGF0YSA9IHstNDAsIC0yMCwgLTEsIDEsMiwzLDUsNyw5LDEyLDE1fTsgCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgTWF5YmVSZXN1bHQKewogIHB1YmxpYzogCiAgTWF5YmVSZXN1bHQoY29uc3QgVCYgX3ZhbCkgOiBpc192YWxpZCh0cnVlKSwgdmFsKF92YWwpIHt9CiAgTWF5YmVSZXN1bHQoKSA6IGlzX3ZhbGlkKGZhbHNlKSwgdmFsKCkge30KCiAgY29uc3QgYm9vbCBpc192YWxpZDsgCiAgY29uc3QgVCB2YWw7IAp9OyAKCgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ck1heWJlUmVzdWx0PHVuc2lnbmVkIGludD4gZmluZF9tYWdpY19pbmRleChjb25zdCBUJiBhcnIsIGNvbnN0IHVuc2lnbmVkIGludCBsLCBjb25zdCB1bnNpZ25lZCBpbnQgcikKewogIGlmKHI8bCkgcmV0dXJuIE1heWJlUmVzdWx0PHVuc2lnbmVkIGludD4oKTsgCiAgaWYobD09cikgcmV0dXJuICAoYXJyW3JdPT1yKT9NYXliZVJlc3VsdDx1bnNpZ25lZCBpbnQ+KHIpOk1heWJlUmVzdWx0PHVuc2lnbmVkIGludD4oKTsgCiAgY29uc3QgdW5zaWduZWQgaW50IHAgPSAobCtyKS8yOyAKICBpZihhcnJbcF09PXApIHJldHVybiBNYXliZVJlc3VsdDx1bnNpZ25lZCBpbnQ+KHApOyAKICBpZihhcnJbcF0gPiBwKSByZXR1cm4gZmluZF9tYWdpY19pbmRleChhcnIsIGwsIHApOyAKICBpZihhcnJbcF0gPCBwKSByZXR1cm4gKHA+bCk/ZmluZF9tYWdpY19pbmRleChhcnIsIHAsIHIpOmZpbmRfbWFnaWNfaW5kZXgoYXJyLCByLCByKTsgCiAgcmV0dXJuIE1heWJlUmVzdWx0PHVuc2lnbmVkIGludD4oKTsgCn0KCgppbnQgbWFpbigpIHsKICBzdGQ6OmNvdXQgPDwgIkhlbGxvIFdvcmxkIVxuIjsKICBhc3NlcnQoZmluZF9tYWdpY19pbmRleChhcnJheTxpbnQsIDExPnstNDAsIC0yMCwgLTEsIDEsMiwzLDUsNyw5LDEyLDE1fSwgMCwgZGF0YS5zaXplKCktMSkudmFsID09IDcgKTsgCgogIGFzc2VydChmaW5kX21hZ2ljX2luZGV4KGFycmF5PGludCwgMTE+ey00MCwgLTIwLCAtMSwgMSwyLDMsNSw2LDksMTIsMTV9LCAwLCBkYXRhLnNpemUoKS0xKS5pc192YWxpZCA9PSBmYWxzZSApOyAKCiAgYXV0byByZXMgPSBmaW5kX21hZ2ljX2luZGV4KGFycmF5PGludCwgMTE+ey00MCwgLTIwLCAtMSwgMSwyLDMsNSw3LDksMTIsMTV9LCAwLCBkYXRhLnNpemUoKS0xKTsgCiAgY291dCA8PCAocmVzLmlzX3ZhbGlkP3RvX3N0cmluZyhyZXMudmFsKToiTm90IEZvdW5kIikgPDwgZW5kbDsgCn0K