Cod sursa(job #645673)

Utilizator DaicuDaicu Alexandru Daicu Data 10 decembrie 2011 12:09:23
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
int n,a[100001],m,min,max;
void citire(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&m);
}

int query1(int i,int j,int x){
	int mij;
	while(i<j){
		mij=(i+j)/2;
		if(a[mij]<=x){
			i=mij+1;
		}
		else 
			j=mij;
	}
	mij=(i+j)/2;
	if(a[mij]>x) 
		--mij;
	return mij;
}

int query0(int i,int j,int x){
	int mij,max=-1;
	while(i<=j){
		mij=(i+j)/2;
		if(a[mij]==x){
			max=mij;
			i=mij+1;
		}
		else
			if(a[mij]>x)
				i=mij+1;
			else
				j=mij-1;
	}
	return max;
}

int query2(int i,int j,int x){
	int mij;
	while(i<j){
		mij=(i+j)/2;
		if(a[mij]>=x)
			j=mij;
		else 
			i=mij+1;
	}
	mij=(i+j)/2;
	if(a[mij]<x)
		++mij;
	return mij;
}


int main(){
	freopen("cautbin.in","r",stdin);
	freopen("cautbin.out","w",stdout);
	citire();
	int x,q;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q,&x);
		if(q==0)
			printf("%d\n",query0(1,n,x));
		else
			if(q==1)
				printf("%d\n",query1(1,n,x));
			else
				printf("%d\n",query2(1,n,x));
	}
	return 0;
}