Cod sursa(job #680431)

Utilizator tiriplicamihaiTiriplica Mihai Dragos tiriplicamihai Data 15 februarie 2012 16:45:56
Problema Cautare binara Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.99 kb
#include<stdio.h>

#define MaxN 100005

int M, N, v[MaxN];
/*int search (int p, int u, int key) {
	int m;

	while (p <= u) {
		m = (p + u) / 2;
		if (v[m] <= key)
			p = m + 1;
		else
			u = m - 1;
	}
	m = (p + u) / 2;

	if (v[m] > key) m --;
	if (v[m] == key)
		return m;
	return -1;
}*/
int search(int li, int ls, int x){
	int mid;
	if(li > ls){
		mid = (li + ls) / 2;
		if(v[mid] > x)
			mid--;
		if( v[mid] == x)
			return mid;
		else
			return -2;
	}
	else{
		mid = (li+ls)/2;
		if(x >= v[mid])
			return search(mid+1, ls, x);
		else
			return search(li, mid - 1, x);
	}
}

int search1(int li, int ls, int x){
	int mid;
	if(li == ls){
		mid = (li + ls)/2;
		if(x < v[mid])
			mid--;
		return mid;
	}
	else{
		mid = (li+ls)/2;
		if(x >= v[mid])
			return search1(mid+1, ls, x);
		else
			return search1(li, mid, x);
	}
}

int search2(int li, int ls, int x){
	int mid;
	if(li == ls){
		mid = (li + ls)/2;
		if(x > v[mid])
			mid++;
		return mid;
	}
	else{
		mid = (li+ls)/2;
		if(x > v[mid])
			return search2(mid+1, ls, x);
		else
			return search2(li, mid, x);
	}
}


int main(){
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);
	int i, poz, op, x, j;
	scanf("%d", &N);
	for(i = 0; i < N; i++)
		scanf("%d", &v[i]);
	scanf("%d", &M);
	for(i = 0; i < M; i++){
		scanf("%d %d", &op, &x);
		poz = search(0, N-1, x);
		switch (op){
			case 0: /*if(poz == -1){
					printf("%d\n", poz);
					break;
				}
				j = poz;
				while(v[j] == x && j < N)
					j++;
				printf("%d\n", j);*/
				printf("%d\n", 1+search(0, N-1, x));
				break;
			case 1: /*while(poz == -1){
					x--;
					poz = search(0, N-1, x);
				}
				j = poz;
				while(v[j] == x && j < N)
					j++;
				printf("%d\n", j);*/
				printf("%d\n", 1+search1(0, N-1, x));
				break;
			case 2: /*while(poz == -1){
					x++;
					poz = (search(0, N-1, x));
				}
				j = poz;
				while(v[j] == x && j >= 0)
					j--;
				printf("%d\n", j + 2);*/
				printf("%d\n", 1+search2(0, N-1, x));
				break;
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}