Cod sursa(job #325695)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 21 iunie 2009 22:55:27
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
# include <stdio.h>
int a[100005],i,j,k,q,n,m,x,y,w;
int caut0 (int i,int j)
{
k=(i+j)/2;
if (a[k]>x)
return caut0 (i,k);
else
if (a[k+1]<=x)
return caut0 (k,j);
else
return k;


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

int caut2 (int i,int j)
{
if (j-i<=2)
for (w=i;w<=j;w++)
if (a[w]>=x)
return w;
k=(i+j)/2;
if (a[k]<x)
return caut2 (k,j);
else
if (a[k-1]<x)
return k;
else
return caut2 (i,k);

}








int main ()
{
freopen ("cautbin.in","r",stdin);
freopen ("cautbin.out","w",stdout);
scanf ("%i",&n);
for (i=1;i<=n;i++)
scanf ("%i",&a[i]);
scanf ("%i",&m);
for (q=1;q<=m;q++)
{
scanf ("%i%i",&y,&x);
if (y==0)
{

w=caut0 (1,n);
if (a[w]==x)
printf ("%i\n",w);
else
printf ("-1\n");
}
if(y==1)
{
if (a[n]<=x)
printf ("%i\n",n);
else
if (a[1]==x)
printf ("1\n");
else
printf ("%i\n",caut1 (1,n));

}

if (y==2)
{
if (a[1]>=x)
printf ("1\n");
else
if (a[n]==x)
printf ("%i\n",n);
else
printf ("%i\n",caut2 (1,n));
}
}

return 0;
}