Cod sursa(job #1425125)

Utilizator GilgodRobert B Gilgod Data 26 aprilie 2015 18:38:59
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>

#define NMAX 100000

const char IN[] = "cautbin.in", OUT[] = "cautbin.out";

using namespace std;

int N;
int v[NMAX];

inline int findPos(int x) {
	int low = 0;
	int high = N - 1;
	int m=0;
	while (low < high) {
		m = low + (high - low) / 2;
		if (v[m] == x) break;
		if (v[m] > x) high = m - 1;
		else low = m + 1;
	}
	if (v[m] == x) {
		while (v[m] == x) ++m;
		return m;
	}
	return -1;
}

inline int findMaxPos(int x) {
	int low = 0;
	int high = N - 1;
	int m = 0;
	while (low < high) {
		m = low + (high - low) / 2;
		if (v[m] <= x && v[m+1] > x) return m+1;
		if (v[m] > x) high = m - 1;
		else low = m + 1;
	}
	return -1;
}

inline int findMinPos(int x) {
	int low = 0;
	int high = N - 1;
	int m = 0;
	while (low <= high) {
		m = low + (high - low) / 2;
		if (v[m] >= x && v[m - 1] < x) return m+1;
		if (v[m] >= x) high = m - 1;
		else low = m + 1;
	}
	return -1;
}

inline void readData() {
	freopen(IN, "r", stdin);
	freopen(OUT, "w", stdout);
	scanf(" %d", &N);
	for (int i = 0; i < N; ++i) scanf(" %d", &v[i]);
	int M;
	scanf(" %d", &M);
	for (int i = 0; i < M; ++i) {
		int mod, x;
		scanf(" %d%d", &mod, &x);
		switch (mod) {
		case 0: printf("%d \n", findPos(x)); break;
		case 1: printf("%d \n", findMaxPos(x)); break;
		case 2: printf("%d \n", findMinPos(x)); break;
		}
	}
	fclose(stdin);
	fclose(stdout);
}

int main() {
	readData();
	return 0;
}