Cod sursa(job #206117)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 4 septembrie 2008 19:19:00
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<stdio.h>

int N,M,a[100010];

FILE *fin=fopen("cautbin.in","r"),
    *fout=fopen("cautbin.out","w");

void rezolvare_0(int nr){

    int li=1,lf=N;
    while(lf-li>1){
        int mij=(li+lf)>>1;
        if(a[mij]<=nr)
            li=mij;
        else
            lf=mij;
    }


    if(a[lf]==nr)
        fprintf(fout,"%d\n",lf);
    else
        if(a[li]==nr)
            fprintf(fout,"%d\n",li);
        else
            fprintf(fout,"-1\n");

}

void rezolvare_2(int nr){

    int li=1,lf=N;
    while(lf-li>1){
        int mij=(li+lf)>>1;
        if(a[mij]<=nr)
            li=mij;
        else
            lf=mij;
    }

//    fprintf(fout,"%d %d ",li,lf);
    if(a[li]>=nr)
        fprintf(fout,"%d\n",li);
    else
        fprintf(fout,"%d\n",lf);

}

void rezolvare_1(int nr){
    int li=1,lf=N;
    while(lf-li>1){
        int mij=(li+lf)>>1;
        if(a[mij]<nr)
            li=mij;
        else
            lf=mij;
    }

//    fprintf(fout,"%d %d ",li,lf);
    if(a[lf]<=nr)
        fprintf(fout,"%d\n",lf);
    else
        fprintf(fout,"%d\n",li);
}
int main(){

    fscanf(fin,"%d",&N);
    for(int i=1;i<=N;i++)
        fscanf(fin,"%d",&a[i]);

    fscanf(fin,"%d",&M);
    for(int i=1;i<=M;i++){
        int x,nr;
        fscanf(fin,"%d%d",&x,&nr);
        if(x==0) rezolvare_0(nr);
        else
            if(x==2) rezolvare_2(nr);
            else
                rezolvare_1(nr);
    }

}