Cod sursa(job #1909164)

Utilizator geek_geekGeek Geek geek_geek Data 7 martie 2017 11:48:52
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <iostream>
using namespace std;

int equal(int v[100010], int st, int dr, int x) {

	while(st <= dr) {
		int mij = st + (dr - st) / 2;
		if(v[mij] == x && v[mij+1] != x)
			return mij;
		if(v[mij] == x || v[mij] < x) 
			st = mij + 1;
		else
			dr = mij - 1;
	}
	return -1;
}

int lower(int v[100010], int st, int dr, int x) {

	if(st > dr)
		return dr;

	int mij = st + (dr - st) / 2;
	
	if(v[mij] <= x && v[mij+1] > x)
		return mij;
	else
		if(v[mij] <= x) {
			return lower(v, mij + 1, dr, x);
		}
		else
			return lower(v, st, mij - 1, x);
}

int great(int v[100010], int st, int dr, int x) {
	
	if(st > dr)
		return dr;

	int mij = st + (dr - st) / 2;
	
	if(v[mij] >= x && v[mij-1] < x) {
		return mij;
	}
	else
		if(v[mij] < x) {
			return great(v, mij + 1, dr, x);
		}
		else {
			return great(v, st, mij - 1, x);	
		}
}

int main() {
	int n, v[100010], m, operatie, numar;
	freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d", &v[i]);
	}
	scanf("%d", &m);
	for(int i = 0; i < m; i++) {
		scanf("%d%d", &operatie, &numar);
		if(operatie == 0) {
			int aux = equal(v, 0, n - 1, numar);
			if(aux != -1)
				printf("%d\n", aux + 1);
			else
				printf("-1\n");
			continue;
		}
		if(operatie == 1) {
			printf("%d\n", lower(v, 0, n - 1, numar) + 1);
			continue;
		}
		if(operatie == 2) {
			printf("%d\n", great(v, 0, n - 1, numar) + 1);
		}
	}
	return 0;
}