Cod sursa(job #515336)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 21 decembrie 2010 09:16:40
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include<stdio.h>
#define N 100001
long bin(long v[N],long p,long q,long x,long y)
{long m=p+(q-p)/2;
if(x==0)
      {if(p>q)
              return -1;
      if(v[m]==y)
              {while(v[m+1]==y)
                      m++;
              return m;}
      if(v[m]<y)
              return bin(v,m+1,q,x,y);
      else
              return bin(v,p,m-1,x,y);}
else
      if(x==1)
              {if(v[m]==y)
                      {while(v[m+1]==y)
                              m++;
                      return m;}
              if(v[m]<y)
                      if(y<v[m+1])
                              return m;
                      else
                              return bin(v,m+1,q,x,y);
              else
                      if(v[m-1]<y)
                              return m-1;
                      else
                              return bin(v,p,m-1,x,y);}
      else
              {if(v[m]==y)
                      {while(v[m-1]==y)
                              m--;
                      return m;}
              if(v[m]<y)
                      if(y<v[m+1])
                              return m+1;
                      else
                              return bin(v,m+1,q,x,y);
              else
                      if(v[m-1]<y)
                              return m;
                      else
                              return bin(v,p,m-1,x,y);}}

int main()
{long n,m,i,x[N],y[N],v[N];
freopen("cautbin.in","r",stdin);
freopen("cautbin.out","w",stdout);
scanf("%ld",&n);
for(i=1;i<=n;i++)
       scanf("%ld",&v[i]);
scanf("%ld",&m);
for(i=1;i<=m;i++)
       {scanf("%ld",&x[i]);
       scanf("%ld",&y[i]);
       if(x[i]==1&&v[n]<y[i])
              printf("%ld\n",n);
       else
              if(x[i]==2&&v[1]>y[i])
                      printf("1\n");
              else
                      printf("%ld\n",bin(v,1,n,x[i],y[i]));}
fclose(stdin);
fclose(stdout);
return 0;}