Cod sursa(job #972211)

Utilizator andrettiAndretti Naiden andretti Data 11 iulie 2013 11:47:34
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define maxn 100005
using namespace std;

int n,m,step;
int v[maxn];

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

int binary_type01(int val)
{
    int i;
    for(i=0;step;step>>=1)
     if(i+step<=n)
     {
         if(v[i+step]==val) return i+step;
         else if(v[i+step]<val) i+=step;
     }
    return i;
}

int binary_type2(int val)
{
    int i;
    for(i=0;step;step>>=1)
     if(i+step<=n)
     {
         if(v[i+step]==val && i+step-1>0 && v[i+step-1]!=val) return i+step;
         else if(v[i+step]<val) i+=step;
     }
    return i;
}

void solve()
{
    int i;
    int type,val,sol;
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&type,&val);
        for(step=1;step<n;step<<=1);
        if(type<2) sol=binary_type01(val);
         else sol=binary_type2(val);

         if(sol==0) printf("-1\n");
         else printf("%d\n",sol);
    }
}

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

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}