Cod sursa(job #1523425)

Utilizator andreeacozma95Cozma Andreea andreeacozma95 Data 12 noiembrie 2015 18:49:07
Problema Cautare binara Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.81 kb
#include <stdio.h>
#include <stdlib.h>

int *x;
int n;
int m;

int cautare_binara(int p, int u, int val)
{
   int m;
   while(p<=u)
   {
       m=p+(u-p)/2;
       if(x[m]==val)
            return m;
       if (x[m]<val)
            p=m+1;
       if (x[m]>val)
            u=m-1;
   }
   return -1;
}

int mod_1(int p, int u, int val)
{
   int m;
   while(p<=u)
   {
      m=p+(u-p)/2;
       if (x[m]==val)
            break;
       if (x[m]<val)
            p=m+1;
       if (x[m]>val)
            u=m-1;
   }
   if (x[m]>val)
        m--;
   return m;
}

int mod_2(int p, int u, int val)
{
   int m;
   while(p<=u)
   {
       m=p+(u-p)/2;
       if (x[m]==val)
            break;
       if (x[m]<val)
            p=m+1;
       if (x[m]>val)
            u=m-1;
   }
   if (x[m]<val)
        m++;
   return m;
}

int main()
{
   FILE *f=fopen("cautbin.in","r");
   FILE *g=fopen("cautbin.out","w");
   int i,op,v,c;

   fscanf(f,"%d",&n);
   x=(int*)malloc((n+1)*sizeof(int));
   for (i=1;i<=n;i++)
        fscanf(f,"%d",&x[i]);

    fscanf(f,"%d",&m);
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&op,&v);
        switch(op)
        {
        case 0:
            {
                c=cautare_binara(1,n,v);
                if (c!=-1)
                    while(x[c+1]==v)
                        c++;
                fprintf(g,"%d\n",c);
                break;
            }
        case 1:
            {
                c=mod_1(1,n,v);
                while (x[c+1]==v)
                    c++;
                fprintf(g,"%d\n",c);
                break;
            }
        case 2:
            {
                c=mod_2(1,n,v);
                fprintf(g,"%d\n",c);
                break;
            }
        }
    }

    return 0;
}