Cod sursa(job #243553)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 13 ianuarie 2009 16:30:22
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#define N 1001

void citire(),rez0(long),rez1(long),rez2(long);
long n,m,a[N];

int main (){
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    citire();
    return 0;
}

void citire(){
long x,y,i;
     scanf("%ld",&n);
     for (i=1;i<=n;i++) scanf("%ld",&a[i]);
     scanf("%ld",&m);
     for (i=1;i<=m;i++){ scanf("%ld %ld",&x,&y);
	if (x==0) rez0(y);
	else
		if (x==1) rez1(y);
		else      rez2(y);
     }
}

void rez0(long y){
long s,d,mij,i;
     s=1;d=n;
     for (;s<=d;){
	   mij=(s+d)/2;
	   if (a[mij]==y)break;
	   else
	       if (a[mij]>y) d=mij-1;
	       else s=mij+1;
     }
     if (s>d) printf("%ld\n",-1);
     else{
	   for (i=mij;a[i]==y;i++);
	   printf("%ld\n",i-1);}
}

void rez1(long y){
long s,d,mij;
     s=1;d=n;
     for (;s<=d;){
	   mij=(s+d)/2;
	   if (a[mij]==y)break;
	   else
	       if (a[mij]>y) d=mij-1;
	       else s=mij+1;
     }
     for (;;mij--)
	if (a[mij]<=y) {printf("%ld\n",mij);break;}
}

void rez2(long y){
long s,d,mij;
     s=1;d=n;
     for (;s<=d;){
	   mij=(s+d)/2;
	   if (a[mij]==y)break;
	   else
	       if (a[mij]>y) d=mij-1;
	       else s=mij+1;
     }
     for (;;mij++)
     if (a[mij]>=y) {printf("%ld\n",mij);break;}
}