Cod sursa(job #2576504)

Utilizator DunareanuDinu Dunareanu Dunareanu Data 6 martie 2020 20:01:28
Problema Cautare binara Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdio.h>
#include <stdlib.h>

FILE *fin , *fout;

int v[100000];

int cb0(int st,int dr,int e) {
    int mij;
    while(dr-st>1) {
        mij=(st+dr)/2;
        if(e<v[mij]) {
            dr=mij;
        }
        else {
            st=mij;
        }
    }
    return st;
}

int cb1(int st,int dr,int e,int n) {
    int mij;
    while(dr-st>1) {
        mij=(st+dr)/2;
        if(e<v[mij]) {
            dr=mij;
        }
        else {
            st=mij;
        }
    }
    if(v[st]==e) {
        return st;
    }
    else {
        int i=st+2;
        while(i<n && v[i]==v[st+1]) {
            i++;
        }
        return i-1;
    }
}

int cb2(int st,int dr,int e) {
    int mij,r=-1;
    while(st<=dr) {
        mij=(st+dr)/2;
        if(v[mij]<e) {
            st=mij+1;
        }
        else {
            dr=mij-1;
            if(v[mij]==e) {
                r=mij;
            }
        }
    }
    if(r!=-1) {
        return r;
    }
    else {
        return st;
    }
}

int main() {
    fin=fopen("cautbin.in","r");
    fout=fopen("cautbin.out","w");

    int n,i,m,a,x,poz;
    fscanf(fin,"%d",&n);
    for(i=0;i<n;i++) {
        fscanf(fin,"%d",&v[i]);
    }
    fscanf(fin,"%d",&m);
    for(i=0;i<m;i++) {
        fscanf(fin,"%d%d",&a,&x);
        if(a==0) {
            poz=cb0(0,n,x);
            if(v[poz]==x) {
                fprintf(fout,"%d\n",poz+1);
            }
            else {
                fprintf(fout,"-1\n");
            }
        }
        else {
            if(a==1) {
                fprintf(fout,"%d\n",cb1(1,n,x,n)+1);
            }
            else {
                fprintf(fout,"%d\n",cb2(1,n,x)+1);
            }
        }
    }

    fclose(fin);
    fclose(fout);
    return 0;
}