Cod sursa(job #1900467)

Utilizator Razvanel6991Razvan Lazar Razvanel6991 Data 3 martie 2017 13:19:03
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.85 kb
#include <stdio.h>
#include <stdlib.h>

void readArray(FILE *in, int *v, int N);
void printArray(int *v, int N);
void readOperation(FILE *in, FILE *out, int *v, int N);
void swap(int *a, int *b);
int operation0(int *v, int lower, int upper, int key);
int operation1(int *v, int lower, int upper, int key);
int operation2(int *v, int lower, int upper, int key);


void swap(int *a, int *b){
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int operation0(int *v, int lower, int upper, int key){
	// rightMost
	int pos;
	if(lower <= upper){
		pos = lower + (upper - lower) / 2;

		if(v[pos] == key){
			if(pos + 1 <= upper && v[pos + 1] == key){
				return operation0(v, pos + 1, upper, key);
			}
			return pos;
		} 
		if(v[pos] > key){
			return operation0(v, lower, pos - 1, key);
		}
		else{
			return operation0(v, pos + 1, upper, key);
		}
	}
	return -1;
}


int operation1(int *v, int lower, int upper, int key){
	// rightMost
	int pos;
	if(lower <= upper){
		pos = lower + (upper - lower) / 2;

		if(v[pos] <= key){
			if(pos + 1 <= upper && v[pos + 1] <= key){
				return operation1(v, pos + 1, upper, key);
			}
			return pos;
		} 
		if(v[pos] > key){
			return operation1(v, lower, pos - 1, key);
		}
		else{
			return operation1(v, pos + 1, upper, key);
		}
	}
	return -1;
}

int operation2(int *v, int lower, int upper, int key){
	// 2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala 
	//cu x in sir. Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x


	int pos;
	if(lower <= upper){
		pos = lower + (upper - lower) / 2;

		if(v[pos] >= key){
			if(pos - 1 >= lower && v[pos - 1] >= key){
				return operation1(v, lower, pos - 1, key);
			}
			return pos;
		} 
		if(v[pos] > key){
			return operation1(v, lower, pos - 1, key);
		}
		else{
			return operation1(v, pos + 1, upper, key);
		}
	}
	return -1;
}

void readArray(FILE *in, int *v, int N){
	for(int i = 0; i < N; i++){
		fscanf(in, "%d", v + i);
	}
}

void printArray(int *v, int N){
	for(int i = 0; i < N; i++){
		printf("%d ", v[i]);
	}
	printf("\n");
}

void readOperation(FILE *in, FILE *out, int *v, int N){
	int M, type, value;
	fscanf(in, "%d", &M);
	for(int i = 0; i < M; i++){
		fscanf(in, "%d", &type);
		fscanf(in, "%d", &value);
		switch(type){
			case 0:{
				int op = operation0(v, 0, N-1, value);
				if( op == -1){
					fprintf(out, "%d\n", -1);
				}
				else{
					fprintf(out, "%d\n", op + 1;
				}
				break;
			}
			case 1:{
				fprintf(out, "%d\n", operation1(v, 0, N-1, value) + 1);
				break;
			}
			case 2:{
				fprintf(out, "%d\n", operation2(v, 0, N-1, value) + 1);
				break;
			}
		}
	}
}

int main(){
	FILE *in, *out;
	int N, *v;
	in = fopen("cautbin.in", "r");
	out = fopen("cautbin.out", "w");

	fscanf(in, "%d", &N);

	v = malloc(N * sizeof(int));

	readArray(in, v, N);
	readOperation(in, out, v, N);

	free(v);
	fclose(in);
	fclose(out);
	return 0;
}