Cod sursa(job #395111)

Utilizator nandoLicker Nandor nando Data 12 februarie 2010 09:51:58
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define MAX 100000
int vec[MAX],n;

int search1(int v){
	int beg=0,end=n-1,mdl,f;
	while(beg<=end){
		mdl=beg+(end-beg)/2;
		if(v==vec[mdl]){
			if(vec[mdl+1]!=v){
				return mdl;
			}else{
				beg=mdl+1;
			}
		}else if(v<vec[mdl]){
			end=mdl-1;
		}else{
			beg=mdl+1;
		}
	}
	return -2;
}
int search2(int v){
	int beg=0,end=n-1,mdl;
	while(beg<=end){
		mdl=beg+(end-beg)/2;
		if(v==vec[mdl]){
			if(vec[mdl+1]>v&&vec[mdl]>=v){
				return mdl;
			}else{
				beg=mdl+1;
			}
		}else if(v<vec[mdl]){
			end=mdl-1;
		}else{
			beg=mdl+1;
		}
	}
	return mdl;
}
int search3(int v){
	int beg=0,end=n-1,mdl;
	while(beg<=end){
		mdl=beg+(end-beg)/2;
		if(v>=vec[mdl]){
			if(vec[mdl-1]<v){
				return mdl;
			}else{
				end=mdl-1;
			}
		}else if(v<vec[mdl]){
			end=mdl-1;
		}else{
			beg=mdl+1;
		}
	}
}
int main(){
	FILE* fin=fopen("cautbin.in","r");
	int m,o,x;
	fscanf(fin,"%d",&n);
	for(int i=0;i<n;i++){
		fscanf(fin,"%d",&vec[i]);
	}
	fscanf(fin,"%d",&m);
	for(int i=0;i<m;i++){
		fscanf(fin,"%d %d",&o,&x);
		switch(o){
			case 0:
				printf("%d\n",search1(x)+1);
				break;
			case 1:
				printf("%d\n",search2(x)+1);
				break;
			case 2:
				printf("%d\n",search3(x)+1);
				break;
			default:
				continue;
		}			
	}
	fclose(fin);
	return 0;
}