Cod sursa(job #677776)

Utilizator marius135Dumitran Adrian Marius marius135 Data 10 februarie 2012 17:16:11
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
// Infoarena - Arhiva Educationala Potrivirea Sirurilor 
// Februrie 2012 Marius Dumitran
// Rabin Karp O(n+m)

#include<string.h>
#include<stdio.h>
int cauta_exact( int val, int *v, int n,int max) {
	int start = 1;
	while( max > 0 ) {
		if( start + max > n || v[ start + max ] > val ) {
			max >>= 1; 
			continue;
		}
		start += max;
		max >>= 1; 
	}
	if( v[ start ] == val ) return start;
	return -1;
		
}
int cauta_mai_mic( int val, int *v, int n,int max) {
	int start = 1;
	while( max > 0 ) {
		if( start + max > n || v[ start + max ] > val ) {
			max >>= 1; 
			continue;
		}
		start += max;
		max >>= 1; 
	}
	if( v[ start ] <= val ) return start;
	return -1;
		
}
int cauta_mai_mare( int val, int *v, int n,int max) {
	int start = n;
	while( max > 0 ) {
		if( start - max < 1 || v[ start - max ] < val ) {
			max >>= 1; 
			continue;
		}
		start -= max;
		max >>= 1; 
	}
	if( v[ start ] >= val ) return start;
	return -1;
		
}


int main() {
	
	int v[100001];
	freopen ("cautbin.in", "r", stdin);
	freopen ("cautbin.out", "w", stdout);
	
	int n, m, max = 1;
	scanf("%d", &n);
	for( int i = 1; i <= n; ++i) 
		scanf("%d", &v[i]);
	while( max <= n ) max <<= 1;
	max >>= 1;
	
	scanf("%d", &m);
	for( int j = 1; j <= m; ++j) {
		int a, b;
		scanf("%d %d", &a, &b);
		if( a == 0) 
			printf("%d\n", cauta_exact(b, v, n, max)); 
		if( a == 1) 
			printf("%d\n", cauta_mai_mic(b, v, n, max)); 
		if( a == 2) 
			printf("%d\n", cauta_mai_mare(b, v, n, max)); 
	}

	return 0;
}