Cod sursa(job #804453)

Utilizator maritimCristian Lambru maritim Data 29 octombrie 2012 20:30:12
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>

FILE *f = fopen("cautbin.in","r");
FILE *g = fopen("cautbin.out","w");

#define MaxN 100100

int N,valGlobal,M;
int A[MaxN];

void citire(void)
{
    fscanf(f,"%d ",&N);
    for(int i=1;i<=N;i++)
        fscanf(f,"%d ",&A[i]);
}

inline int CautBinCaz1(int a)
{
    int poz = 1;

    for(int val = valGlobal;val;val >>= 1)
        if(poz+val <= N && A[poz+val] <= a)
            poz += val;

    return poz;
}

inline int CautBinCaz2(int a)
{
    int poz = 0;

    for(int val = valGlobal;val;val >>= 1)
        if(poz+val <= N && A[poz+val] < a)
            poz += val;

    return ++poz;
}

int main()
{
    int op,nr,poz;

    citire();

    for(valGlobal = 1;valGlobal <= N;valGlobal <<= 1);

    fscanf(f,"%d",&M);
    for(int i=1;i<=M;i++)
    {
        fscanf(f,"%d %d\n",&op,&nr);
        switch(op)
        {
            case 0 : poz = CautBinCaz1(nr); 
                     fprintf(g,"%d\n",A[poz] == nr ? poz : -1);
                        break;
            case 1 : fprintf(g,"%d\n",CautBinCaz1(nr));
                        break;
            default : fprintf(g,"%d\n",CautBinCaz2(nr));
        }
    }
}