Cod sursa(job #972235)

Utilizator andrettiAndretti Naiden andretti Data 11 iulie 2013 12:25:51
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 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_type0(int val)
{
    int i;
    for(i=0;step;step>>=1)
     if(i+step<=n && val>=v[i+step])
      i+=step;

    if(v[i]!=val) return 0;
    else
    return i;
}

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

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

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==0) sol=binary_type0(val);
        else
         if(type==1) sol=binary_type1(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;
}