#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define TEST_COUNT 1000
typedef int bool;
typedef int (*searcher)(int *A, int x, int l, int r);
int cmp(const void *a, const void *b) { return *(int*)b - *(int*)a; }
int linsearch(int *A, int x, int n) {
int i;
for (i = 0; i < n; i++) {
if (A[i] == x) {
return i;
}
}
return -1;
}
void print(int *A, int n) {
if (n > 0) {
}
int i;
for (i = 1; i < n; i++) {
}
}
void test(searcher s) {
//~ if (s(0, 0, 0, -1) != -1) {
//~ printf("FAIL! []\n");
//~ return;
//~ }
int A[TEST_COUNT];
int i, j;
for (i = 1; i < TEST_COUNT; i++) {
for (j = 0; j < i; j++) {
}
qsort(A
, sizeof(int), i
, cmp
);
int k = s(A, x, 0, i-1);
int l = linsearch(A,x,i);
if (k == -1) {
if (l != -1) {
printf("FAIL! x = %d, k = %d, l = %d\n", x
, k
, l
); print(A, i);
return;
}
} else if (A[k] != x) {
printf("FAIL! x = %d, k = %d, l = %d\n", x
, k
, l
); print(A, i);
return;
}
}
}
int mock(int *A, int x, int l, int r) {
return linsearch(A, x, r);
}
int szuk_rek(int *A, int X, int L, int R){
// printf("L =%d R = %d\n", L, R);
if(A[L] > X || A[R] < X){
return 0;
}
if(A[R]==X){
return R;
}
if(L > R){
return -1;
}
if( L == R && A[L] != X){
return -1;
}
if (A[(L+R)/2]== X){
return (L+R)/2;
}
if( A[(L+R)/2] < X){
return szuk_rek(A, X, (L + R)/2, R);
}
if( A[(L+R)/2] > X){
return szuk_rek(A, X, L, (L + R)/2);
}
}
int main(void) {
test(szuk_rek);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgVEVTVF9DT1VOVCAxMDAwCgoKdHlwZWRlZiBpbnQgYm9vbDsKdHlwZWRlZiBpbnQgKCpzZWFyY2hlcikoaW50ICpBLCBpbnQgeCwgaW50IGwsIGludCByKTsKCmludCBjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeyByZXR1cm4gKihpbnQqKWIgLSAqKGludCopYTsgfQoKaW50IGxpbnNlYXJjaChpbnQgKkEsIGludCB4LCBpbnQgbikgewoJaW50IGk7Cglmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkJaWYgKEFbaV0gPT0geCkgewoJCQlyZXR1cm4gaTsKCQl9Cgl9CglyZXR1cm4gLTE7Cn0KCnZvaWQgcHJpbnQoaW50ICpBLCBpbnQgbikgewoJcHJpbnRmKCJbIik7CglpZiAobiA+IDApIHsKCQlwcmludGYoIiVkIiwgQVswXSk7Cgl9CglpbnQgaTsKCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKCQlwcmludGYoIiwgJWQiLCBBW2ldKTsKCX0KCXByaW50ZigiXVxuIik7Cn0KCnZvaWQgdGVzdChzZWFyY2hlciBzKSB7CgkvL34gaWYgKHMoMCwgMCwgMCwgLTEpICE9IC0xKSB7CgkJLy9+IHByaW50ZigiRkFJTCEgW11cbiIpOwoJCS8vfiByZXR1cm47CgkvL34gfQoJCglpbnQgQVtURVNUX0NPVU5UXTsKCWludCBpLCBqOwoJZm9yIChpID0gMTsgaSA8IFRFU1RfQ09VTlQ7IGkrKykgewoJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKCQkJQVtqXSA9IGFicyhyYW5kKCkpICUgaTsKCQl9CgkJaW50IHggPSBhYnMocmFuZCgpKSAlIGk7CgkJCgkJcXNvcnQoQSwgc2l6ZW9mKGludCksIGksIGNtcCk7CgkJCgkJaW50IGsgPSBzKEEsIHgsIDAsIGktMSk7CgkJaW50IGwgPSBsaW5zZWFyY2goQSx4LGkpOwoJCWlmIChrID09IC0xKSB7CgkJCWlmIChsICE9IC0xKSB7CgkJCQlwcmludGYoIkZBSUwhIHggPSAlZCwgayA9ICVkLCBsID0gJWRcbiIsIHgsIGssIGwpOwoJCQkJcHJpbnQoQSwgaSk7CgkJCQlyZXR1cm47CgkJCX0KCQl9IGVsc2UgaWYgKEFba10gIT0geCkgewoJCQlwcmludGYoIkZBSUwhIHggPSAlZCwgayA9ICVkLCBsID0gJWRcbiIsIHgsIGssIGwpOwoJCQlwcmludChBLCBpKTsKCQkJcmV0dXJuOwoJCX0KCX0KCXByaW50ZigiT0shXG4iKTsKfQoKaW50IG1vY2soaW50ICpBLCBpbnQgeCwgaW50IGwsIGludCByKSB7CglyZXR1cm4gbGluc2VhcmNoKEEsIHgsIHIpOwp9CgoKaW50IHN6dWtfcmVrKGludCAqQSwgaW50IFgsIGludCBMLCBpbnQgUil7Ci8vICAgICAgICBwcmludGYoIkwgPSVkIFIgPSAlZFxuIiwgTCwgUik7CiAgICAgICAgaWYoQVtMXSA+IFggfHwgQVtSXSA8IFgpewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmKEFbUl09PVgpewogICAgICAgICAgICAgICAgcmV0dXJuIFI7CiAgICAgICAgfQogICAgICAgIGlmKEwgPiBSKXsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgaWYoIEwgPT0gUiAmJiBBW0xdICE9IFgpewogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KIAogICAgICAgIGlmIChBWyhMK1IpLzJdPT0gWCl7CiAgICAgICAgICAgICAgICByZXR1cm4gKEwrUikvMjsKICAgICAgICB9CiAKICAgICAgICBpZiggQVsoTCtSKS8yXSA8IFgpewogICAgICAgICAgICAgICAgcmV0dXJuIHN6dWtfcmVrKEEsIFgsIChMICsgUikvMiwgUik7CiAgICAgICAgfQogICAgICAgIGlmKCBBWyhMK1IpLzJdID4gWCl7CiAgICAgICAgICAgICAgICByZXR1cm4gc3p1a19yZWsoQSwgWCwgTCwgKEwgKyBSKS8yKTsKICAgICAgICB9CiAgICAgICAgCn0KCmludCBtYWluKHZvaWQpIHsKCXNyYW5kKDYpOwoJCgl0ZXN0KHN6dWtfcmVrKTsKCQoJCgkKCXJldHVybiAwOwp9Cg==