Cod sursa(job #1078028)

Utilizator xaphariusMihai Suteu xapharius Data 11 ianuarie 2014 22:31:03
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <assert.h>
using namespace std;

#define NMAX 100000

int N, M;
int v[NMAX];


int cautbin(int lo, int hi, int x){
	if (lo > hi) 
		return -1;
	
	int mid = lo + (hi - lo)/2;
	printf("%d\n", mid);
	if (v[mid] == x) 
		return mid;
	if (v[mid] < x)
		return cautbin(mid + 1, hi, x);
	else if (v[mid] > x)
		return cautbin(lo, mid - 1 , x);
	else
		assert(!"missed a case in cautbin");
}

//cea mai mare pozitie pe care se afla un element cu valoarea x
int cautbin0(int lo, int hi, int x){
	if (lo > hi) 
		return -2;
	
	int mid = lo + (hi - lo)/2;
	//printf("%d\n", mid);
	if (v[mid] == x && (mid == N-1 || v[mid+1] != x)) 
		return mid;
	if (v[mid] <= x)
		return cautbin0(mid + 1, hi, x);
	else if (v[mid] > x)
		return cautbin0(lo, mid - 1 , x);
	else
		assert(!"missed a case in cautbin0");
}

//cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x
int cautbin1(int lo, int hi, int x){
	int mid = lo + (hi - lo)/2;
	//printf("%d\n", mid);
	if (v[mid] <= x && (mid  == N-1 || v[mid+1] > x)) 
		return mid;
	if (v[mid] <= x)
		return cautbin1(mid + 1, hi, x);
	else if (v[mid] > x)
		return cautbin1(lo, mid - 1 , x);
	else
		assert(!"missed a case in cautbin1");
}

//cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x
int cautbin2(int lo, int hi, int x){
	int mid = lo + (hi - lo)/2;
	//printf("%d\n", mid);
	if (v[mid] >= x && (mid == 0 || v[mid-1] < x)) 
		return mid;
	if (v[mid] < x)
		return cautbin2(mid + 1, hi, x);
	else if (v[mid] >= x)
		return cautbin2(lo, mid - 1 , x);
	else
		assert(!"missed a case in cautbin2");
}


int main(){
	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, opt, x, pos; i < M; ++i){
		scanf("%d %d", &opt, &x);
		switch(opt){
			case 0: 
				pos = cautbin0(0, N-1, x);
				break;
			case 1: 
				pos = cautbin1(0, N-1, x);
				break;
			case 2: 
				pos = cautbin2(0, N-1, x);
				break;
		}
		printf("%d\n", pos+1);
	}
	fclose(stdin);
	fclose(stdout);
}