Cod sursa(job #2241618)

Utilizator GheorghitaGheorghita Stefan-Marian Gheorghita Data 16 septembrie 2018 14:49:37
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f ("cautbin.in");
ofstream g ("cautbin.out");

int n,m;
int a[100005];

void cautbin0(int x)
{
    int i;
    int st=1, dr=n,mid;
    int var;
    if(n%2==1)mid=n/2+1;
    else mid=n/2;
    while (1==1)
    {
        if(st==dr)break;
        if(x==a[mid])break;
        if(x<a[mid])
        {
            dr=mid;
            var=dr-st;
            if(var%2==1) mid=var/2+1;
            else mid = var/2;
        }
        if(x>a[mid])
        {
            st=mid;
            var=dr-st;
            if(var%2==1) mid=var/2+1;
            else mid=var/2;
        }
    }
    int ii;
    ii=mid;
    for(i=ii;i<=n;i++)
    {
        if(a[i]==a[mid])mid=i;
    }
    g<<mid<<"\n";
}

void cautbin1(int x)
{
    int i;
    int st=1, dr=n,mid;
    int var;
    if(n%2==1)mid=n/2+1;
    else mid=n/2;
    while (1==1)
    {
        if(x==a[mid] || a[mid]<x)break;
        if(x<a[mid])
        {
            dr=mid;
            var=dr-st;
            if(var%2==1) mid=var/2+1;
            else mid = var/2;
        }
        if(x>a[mid])
        {
            st=mid;
            var=dr-st;
            if(var%2==1) mid=var/2+1;
            else mid=var/2;
        }
    }
    int ii;
    ii=mid;
    for(i=ii;i<=n;i++)
    {
        if(a[i]==a[mid] || a[i]<a[mid])mid=i;
    }
    g<<mid<<"\n";
}

void cautbin2(int x)
{
    int i;
    int st=1, dr=n,mid;
    int var;
    if(n%2==1)mid=n/2+1;
    else mid=n/2;
    while (1==1)
    {
        if(x==a[mid] || a[mid]>x)break;
        if(x<a[mid])
        {
            dr=mid;
            var=dr-st;
            if(var%2==1) mid=var/2+1;
            else mid = var/2;
        }
        if(x>a[mid])
        {
            st=mid;
            var=dr-st;
            if(var%2==1) mid=var/2+1;
            else mid=var/2;
        }
    }
    int ii;
    ii=mid;
    for(i=ii;i>=1;i--)
    {
        if(a[i]==a[mid] || a[i]>a[mid])mid=i;
    }
    g<<mid<<"\n";
}

int main()
{
    int i,c;
    int nr;
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>a[i];
    }
    f>>m;
    for(i=1;i<=m;i++)
    {
        f>> c >> nr;
        if(c==0)cautbin0(nr);
        if(c==1)cautbin1(nr);
        if(c==2)cautbin2(nr);
    }
    return 0;
}