Cod sursa(job #1798696)

Utilizator rares1012Rares Cautis rares1012 Data 5 noiembrie 2016 12:54:39
Problema Cautare binara Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>

int v[10000],n;

inline int f1(int x,int pas)
{
    int r=-1;
    while(pas>0)
    {
        if(r+pas<n && r+pas>=0 && v[r+pas]<=x)
            r+=pas;
        pas/=2;
    }
    if(v[r]<x)
        return -1;
    return r+1;
}

inline int f2(int x,int pas)
{
    int r=-1;
    while(pas>0)
    {
        if(r+pas<n && r+pas>=0 && v[r+pas]<=x)
            r+=pas;
        pas/=2;
    }
    return r+1;
}

inline int f3(int x,int pas)
{
    int r=-1;
    while(pas>0)
    {
        if(r+pas<n && r+pas>=0 && v[r+pas]<x)
            r+=pas;
        pas/=2;
    }
    return r+2;
}

int main()
{
    int i,k,c,x,r,p;
    FILE*fi,*fo;
    fi=fopen("cautbin.in","r");
    fo=fopen("cautbin.out","w");
    fscanf(fi,"%d",&n);
    for(i=0; i<n; i++)
    {
        fscanf(fi,"%d",&v[i]);
    }
    fscanf(fi,"%d",&k);
    p=1<<16;
    while(p>n)
        p/=2;
    for(i=0; i<k; i++)
    {
        fscanf(fi,"%d%d",&c,&x);
        if(c==0)
            r=f1(x,p);
        else if(c==1) r=f2(x,p);
        else r=f3(x,p);
        fprintf(fo,"%d\n",r);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}