Cod sursa(job #680405)

Utilizator tiriplicamihaiTiriplica Mihai Dragos tiriplicamihai Data 15 februarie 2012 16:09:20
Problema Cautare binara Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>

#define MaxN 100005

int M, N, v[MaxN];

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;
}