Cod sursa(job #345624)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 3 septembrie 2009 20:12:56
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>

FILE *fin=fopen("cautbin.in","r"),
	*fout=fopen("cautbin.out","w");

int N,M,A[200090];

void rezolvare_0(int nr)
{
	int li=1,lf=N;
	while(li<lf-1)
	{
		int mij=(li+lf)/2;
		if(nr<=A[mij])
			li=mij;
		else
			lf=mij;
	}
	if(A[lf]==nr)
		fprintf(fout,"%d\n",lf);
	else if(A[li]==nr)
		fprintf(fout,"%d\n",li);
	else fprintf(fout,"-1\n");

}

void rezolvare_1(int nr)
{
	int li=1,lf=N;
	while(li<lf-1)
	{
		int mij=(li+lf)/2;
		if(nr<=A[mij])
			li=mij;
		else
			lf=mij;
	}
	if(A[lf]==nr)
		fprintf(fout,"%d\n",lf);
	else fprintf(fout,"%d\n",li);
}
void rezolvare_2(int nr)
{
	int li=1,lf=N;
	while(li<lf-1)
	{
		int mij=(li+lf)/2;
		if(nr<A[mij])
			li=mij;
		else
			lf=mij;
	}
	if(A[li]==nr)
		fprintf(fout,"%d\n",li);
	else fprintf(fout,"%d\n",lf);
}
int main()
{
	fscanf(fin,"%d",&N);
	for(int i=1;i<=N;i++)
		fscanf(fin,"%d",&A[i]);
	fscanf(fin,"%d",&M);
	while(M--)
	{
		int x,nr;
		fscanf(fin,"%d %d",&x,&nr);
		if(x==0)
			rezolvare_0(nr);
		if(x==1)
			rezolvare_1(nr);
		if(x==2)
			rezolvare_2(nr);
	}
	fclose(fin);
	fclose(fout);
	return 0;
}