Cod sursa(job #2764806)

Utilizator F.MatyiFischer Matyas Zsigmond F.Matyi Data 22 iulie 2021 17:39:19
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
//#include <fstream>
#include <cstdio>

FILE* in;
FILE* out;

using namespace std;

long binKer_0(long a[], long x, int n)
{
    int bal=1, jobb=n, k;
    while(bal<=jobb){
        k=(bal+jobb)/2;
        if(x<a[k]) jobb=k-1;
        else if(x>a[k]) bal=k+1;
             else{
                int k2=k;
                while(a[k]==a[k2]){
                    k2++;
                }
                return k2-1;
             }
    }
    return -1;
}

int binKer_1(long a[], long x, int n)
{
    int bal=1, jobb=n, k;
    while(bal<jobb){
        k=(bal+jobb)/2;
        if(a[k]<=x) bal=k+1;
        else jobb=k;
    }
    k=(bal+jobb)/2;
    if(a[k]>x) k--;
    return k;
}

int binKer_2(long a[], long x, int n)
{
    int bal=1, jobb=n, k;
    while(bal<jobb){
        k=(bal+jobb)/2;
        if(a[k]<x) bal=k+1;
        else jobb=k;
    }
    k=(bal+jobb)/2;
    if(a[k]<x) k++;
    return k;
}


int main()
{
    in=fopen("cautbin.in", "r");
    out=fopen("cautbin.out", "w");
    int n, m;
    long x, l;
    fscanf(in, "%d", &n);
    long a[n+1];
    for(int i=1; i<=n; i++) fscanf(in, "%d", &a[i]);
    fscanf(in, "%d", &m);
    for(int i=1; i<=m; i++){
        //in>>l; in>>x;
        fscanf(in, "%d %d", &l, &x);
        if(l==0) fprintf(out, "%d \n", binKer_0(a,x,n)); //out<<binKer_0(a, x, n)<<endl;
        if(l==1) fprintf(out, "%d \n", binKer_1(a,x,n)); //out<<binKer_1(a, x, n)<<endl;
        if(l==2) fprintf(out, "%d \n", binKer_2(a,x,n)); //out<<binKer_2(a, x, n)<<endl;
    }
    return 0;
}