Cod sursa(job #343968)

Utilizator raica_cristiraica dumitru cristian raica_cristi Data 27 august 2009 22:02:14
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.7 kb
#include<stdio.h>

#define dim 1001

int a[dim] , n , m , tip ,nr;
int caut0(int nr)
{
    int st , dr , mid , val=-1;
    for( st=1 , dr=n ; st<=dr ;)
    {
                 mid=(st+dr)/2;
                 if (nr==a[mid])
                 if(mid>=val)
                 {
                      val=mid ;
                      break;
                   }
                 else 
                      st=mid+1;
                 else
                 
                     dr=mid-1;
        }
        if(val!=-1)
        while(a[val]==a[val+1]&& a[val]==nr && val!=-1)
        val++;
    return val;
}
int caut1(int nr)
{
    int st , dr , mid , val=n+1;
    for( st=1 , dr=n ; st<=dr ;)
    {
                 mid=(st+dr)/2;
                 if (nr==a[mid])
                 {
                                if(mid>=val)
                 {
                      val=mid ;
                      break;
                   }
                 else
                 if(a[mid-1]<=nr || a[mid+1]>=nr)
                 {
                 val=mid-1;
                 break;
                 }
                 
                   }
                                    
                 else if (nr<a[mid])
                      st=mid+1;
                 else
                 
                     dr=mid-1;
        }
        if(val!=-1 && a[val]==nr)
        while(a[val]==a[val+1]&& a[val]==nr && val!=-1)
        val++;
        
    return val;
}
int caut2(int nr)
{
    int st , dr , mid , val=-1;
    for( st=1 , dr=n ; st<=dr ;)
    {
                 mid=(st+dr)/2;
                 if (nr==a[mid] )
                 {
                      val=mid ;
                      break;
                   }
                 else
                 if( a[mid-1]<=nr && a[mid+1]>=nr)
                 {
                     val=mid+1;
                     break;
                     }
                 else if (nr<a[mid])
                      st=mid+1;
                 else
                 
                     dr=mid-1;
        }
         while(a[val]==a[val-1] && a[val]==nr && val!=-1)
        val--;
       return val;
}

void solve()
{
     
     for(int k=1 ; k<=m;k++)
     {
             scanf("%d%d",&tip,&nr);
            if(tip==0)
             printf("%d\n",caut0(nr));
            else
          if(tip==1)
             printf("%d\n",caut1(nr));
             else
             printf("%d\n",caut2(nr));
             }
     
     
 } 
int main ()
{
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    scanf("%d",&n);
    for(int i=1 ; i<=n ; i++)
    scanf("%d",&a[i]);
    scanf("%d",&m);
    solve();
    
    }