Cod sursa(job #1021415)

Utilizator radustn92Radu Stancu radustn92 Data 3 noiembrie 2013 19:53:57
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#include <iostream>
#define NMAX 100005
#define LMAX (1 << 16)
using namespace std;
int n, m, A[NMAX], pos;
int cb1(int *, int, int);
int cb2(int *, int, int);
int cb3(int *, int, int);
typedef int (*func) (int *, int, int);
func funcs[] = {cb1, cb2, cb3};
char line[LMAX];
 
int cb1(int *A, int n, int val)
{
    int left = -1, right = n, mid;
    while (right - left > 1)
    {
        mid = (left + right) / 2;
        if (A[mid] <= val)
            left = mid;
        else
            right = mid;
    }
    if (left == -1 || A[left] != val)
        return -1;
    return left + 1;
}
 
int cb2(int *A, int n, int val)
{
    int left = -1, right = n, mid;
    while (right - left > 1)
    {
        mid = (left + right) / 2;
        if (A[mid] <= val)
            left = mid;
        else
            right = mid;
    }
    return left + 1;
}
 
int cb3(int *A, int n, int val)
{
    int left = -1, right = n, mid;
    while (right - left > 1)
    {
        mid = (left + right) / 2;
        if (A[mid] < val)
            left = mid;
        else
            right = mid;
    }
    return right + 1;
}

void read_int(int &x)
{
	x = 0;
	while (pos < LMAX && !isdigit(line[pos]))
		if (++pos == LMAX)
			fread(line, 1, LMAX, stdin), pos = 0;
			
	while (pos < LMAX && isdigit(line[pos]))
	{
		x = x * 10 + line[pos] - '0';
		if (++pos == LMAX)
			fread(line, 1, LMAX, stdin), pos = 0;
	}
}
 
int main()
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
	read_int(n);
    int i, type, x;
    for (i = 0; i < n; i++)
		read_int(A[i]);
     
    read_int(m);
    for (i = 0; i < m; i++)
    {
		read_int(type); read_int(x);
        cout << funcs[type](A, n, x) << "\n";
    }
    return 0;
}