Cod sursa(job #2047586)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 25 octombrie 2017 00:08:21
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cautbin.in");
ofstream g("cautbin.out");

const int NMax = 1e5 + 5;

 
int binary_search_0_1(int A[], int N, int val)
{
    int i, step;
    for (step = 1; step < N; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step < N && A[i + step] <= val)	
           i += step;
    return i;
}

int binary_search_2(int A[], int N, int val)
{
    int i, step;
    for (step = 1; step < N; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step < N && A[i + step] < val)	
           i += step;
    return i;
}

int main()
{
	int N, A[NMax];
	f >> N;
	for(int i = 0; i < N; ++i) {
		f >> A[i];
	}

	int M;
	f >> M;

	for(int i = 1; i <= M; ++i) {
		int interogare, x;

		f >> interogare >> x;

		if(interogare == 0) {
			int poz = binary_search_0_1(A, N, x);
			if(poz == N -1) {
				if(A[N - 1] != x) {
					g << -1 << '\n';
				}
				else {
					g << poz + 1 << '\n';
				}
			}
			else {
				if(poz == 0) {
					if(A[0] != x) {
						g << -1 << '\n';
					}
					else {
						g << poz + 1 << '\n';
					}
				}
				else {
					g << poz + 1 << '\n';
				}
			}
		}

		if(interogare == 1) {
			int poz = binary_search_0_1(A, N, x);

			//if(A[poz] <= x) {
				g << poz + 1 << '\n';
			//}
		}

		if(interogare == 2) {
			int poz = binary_search_2(A, N, x);

			if(poz == 0) {
				if(A[0] >= x) {
					g << poz + 1 << '\n';
				}
				else {
					g << poz + 2 << '\n';
				}
			}
			else {
				g << poz + 2 << '\n';
			}
		}
	}
	return 0;
}