Cod sursa(job #680428)

Utilizator tiriplicamihaiTiriplica Mihai Dragos tiriplicamihai Data 15 februarie 2012 16:41:59
Problema Cautare binara Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.89 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 -2;
}
/*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 p, int u, int key) {
	int m, n = u;

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

	m = (p + u) / 2;
	if (v[m] > key)
		-- m;
	return m;
}

int search2 (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;
	}

	m = (p + u) / 2;
	if (v[m] < key)
		++ m;
	return m;
}
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;
}