Cod sursa(job #680411)

Utilizator tiriplicamihaiTiriplica Mihai Dragos tiriplicamihai Data 15 februarie 2012 16:16:04
Problema Cautare binara Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.32 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){
		if( v[li] == x)
			return li;
		else
			return -1;
	}
	else{
		mid = (li+ls)/2;
		if(x > v[mid])
			return search(mid+1, ls, x);
		else
			return search(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);
				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);
				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);
				break;
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}