Cod sursa(job #819982)

Utilizator radupetriselPetrisel Radu radupetrisel Data 19 noiembrie 2012 21:52:48
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>

int v[100005];
int bin0 (int l, int r, int k){
	
	int mid=l+(r-l)/2;
	
	if (k<v[l] || k>v[r]) return -1;
		else if (v[l]==k) return l;
			else if (v[r]==k) return r;
				else if (v[mid]==k) return mid;
					else if (k<v[mid]) return bin0 (l, mid-1, k);
						else return bin0 (mid+1, r, k);
}

int bin1 (int l, int r, int k){
	
	int mid=l+(r-l)/2;
	
	if (k==v[mid]) return mid;
		else if (k>v[mid]) return bin1 (l, mid-1, k);
			else return bin1 (mid+1, r, k);
}

int bin2 (int l, int r, int k){
	
	int mid=l+(r-l)/2;
	
	if (k==v[mid]) return mid;
		else if (k<v[mid]) return bin2 (l, mid-1, k);
			else return bin2 (mid+1, r, k);
}

int main (){
	
	freopen ("cautbin.in", "r", stdin);
	freopen ("cautbin.out", "w", stdout);
	
	int n, m;
	
	scanf ("%d", &n);
	
	for (int i=1; i<=n; i++)
		scanf ("%d", &v[i]);
	
	scanf ("%d", &m);
	
	int p;
	for (int i=1; i<=m; i++){
		scanf ("%d", &p);
		int k;
		scanf ("%d", &k);
		if (p==0){
			int s;
			s=bin0(1, n, k);
			while (v[s]==k) s++;
			printf ("%d\n", s-1);
		}
		if (p==1){
			int s=bin1 (1, n, k);
			while (v[s]==v[s+1]) s++;
			printf ("%d\n", s);
		}
		if (p==2){
			int s=bin2 (1, n, k);
			while (v[s]==v[s-1]) s--;
			printf ("%d\n", s);
		}
	}
	
	return 0;
}