Cod sursa(job #1162967)

Utilizator macajouMaca George macajou Data 1 aprilie 2014 08:49:27
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#define nmax 100010

using namespace std;

int n,m,a[nmax];

void citire()
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
}

void zero(int x)
{
    int st=1,dr=n,mij;
    while(st<dr-1)
          {
              mij=st+(dr-st)/2;
              if(x<a[mij])
                 dr=mij;
              else st=mij;
          }
    if(a[dr]==x)
       printf("%d\n",dr);
    else if(a[st]==x)
       printf("%d\n",st);
    else printf("-1\n");
}

void unu(int x)
{
    int st=1,dr=n,mij;
    while(st<dr-1)
          {
              mij=st+(dr-st)/2;
              if(x<a[mij])
                 dr=mij;
              else st=mij;
          }
    if(a[dr]<=x)
       printf("%d\n",dr);
    printf("%d\n",st);
}

void doi(int x)
{
    int st=1,dr=n,mij;
    while(st<dr-1)
          {
              mij=st+(dr-st)/2;
              if(x<=a[mij])
                 dr=mij;
              else st=mij;
          }
    if(a[st]>=x)
       printf("%d\n",st);
    printf("%d\n",dr);
}

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

    int op,x,i;
    citire();
    for(i=1;i<=m;i++)
        {
            scanf("%d%d",&op,&x);
            if(op==0)
               zero(x);
            else if(op==1)
               unu(x);
            else doi(x);
        }

    return 0;
}