Cod sursa(job #1721427)

Utilizator elena.marinicaMarinica Elena-Georgiana elena.marinica Data 25 iunie 2016 17:16:36
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <stdio.h>
/*
int binary_search(int v[], int x, int left, int right) {
	
	int mid = left + (right - left) / 2;
	
	if (v[mid] == x && left > right) {
		return mid;
	}
	
	else if (x < v[mid]) {
		right = mid - 1;
		binary_search(v, x, left, right);
	}
	else if (x >= v[mid]) {
		left = mid + 1;
		binary_search(v, x, left, right);
	}
	else {
		return -1;
	}


}
*/

const int NMAX = 300009;

int v[NMAX];

int binary_search0(int v[], int x, int N) {
	
	int pos ; int step;
	
	for(step = 1; step <= N ; step *= 2);
	
	for(pos = 1; step > 0; step /= 2)
		if(pos + step <= N && v[pos + step] <= x)
			pos += step;
			
	if(v[pos] == x) return pos;
	return -1;
}

int binary_search1(int v[], int x, int N) {
	
	int pos ; int step;
	
	for(step = 1; step <= N ; step *= 2);
	
	for(pos = 1; step > 0; step /= 2)
		if(pos + step <= N && v[pos + step] <= x)
			pos += step;
			
	return pos;
}


int binary_search2(int v[], int x, int N) {
	
	int pos ; int step;
	
	step = (1 << 23);
	
	for(pos = 1; step > 0; step /= 2)
		if(pos + step <= N && v[pos + step] < x)
			pos += step;
			
	return pos + 1;
}

int main() {
	
	int N, M, test, x;
	FILE *fin = fopen("cautbin.in", "r");
	FILE *fout = fopen("cautbin.out", "w");
	
	fscanf(fin, "%d", &N);
	
	for (int i = 1; i <= N; i++) {
		fscanf(fin, "%d", &v[i]);
	}
	
	fscanf(fin, "%d", &M);

	for (int i = 0; i < M; i++) {
	
		fscanf(fin, "%d %d", &test, &x);
		
		
		
		if (test == 0) {
			fprintf(fout, "%d\n", binary_search0(v, x, N));
			
		}
		else if (test == 1) { // lower bound
			fprintf(fout, "%d\n", binary_search1(v, x, N));
			
			
				
		}
		else if (test == 2) { // upper bound
			fprintf(fout, "%d\n", binary_search2(v, x, N));
			
		}
	
	}
	
	fclose(fin);
	fclose(fout);
	
}