Cod sursa(job #1095691)

Utilizator laxapPascal laxap Data 31 ianuarie 2014 18:17:37
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>


int binary (int x, int len, int arr []) {
	int l = 0;
	int r = len-1;
	int m = r/2;
	while(arr[m]!=x) {
		if (r<l)
			return -1;
		else if (arr[m]<x)
			l=m+1;
		else
			r=m-1;
		m=(r+l)/2;
	}
	return m;
}

int binaryOne (int x, int len, int arr []) { //highest pos of an elem x
	int l = 0;
	int r = len-1;
	int m = r/2;
	while(arr[m]!=x || (arr[m]==x && ( m!=(len-1) && arr[m+1]==x ) ) ) {
		if (r<l)
			return -1;
		else if (arr[m]<x && (m==(len-1) || arr[m+1]>x))
			return m;
		else if (arr[m]<=x)
			l=m+1;
		else
			r=m-1;
		m=(r+l)/2;
	}
	return m;
}


int binaryZero (int x, int len, int arr []) { //highest pos of an elem x
	int l = 0;
	int r = len-1;
	int m = r/2;
	while(arr[m]!=x || (arr[m]==x && ( m!=(len-1) && arr[m+1]==x ) ) ) {
		if (r<l)
			return -1;
		else if (arr[m]<=x)
			l=m+1;
		else
			r=m-1;
		m=(r+l)/2;
	}
	return m;
}



int main () {
	freopen("cautbin.in","r",stdin);
	freopen("cautbin.out","w",stdout);
	
	int n;
	scanf("%d",&n);
	
	int data[n];
	for (int i=0;i<n;i++)
		scanf("%d",&data[i]);
		
	int m;
	scanf("%d",&m);
	for (int i=0;i<m;i++) {
		int order;
		int arg;
		scanf("%d",&order);
		scanf("%d",&arg);
		if (order==0) {
			printf("%d\n",(binaryZero(arg,n,data) + 1));
		}
		else if (order==1){
			printf("%d\n",(binaryOne(arg,n,data) + 1));
		}
		else if (order==2){
			
		}
	}
	
	fclose(stdin);
	fclose(stdout);
}