Cod sursa(job #1468290)

Utilizator zertixMaradin Octavian zertix Data 5 august 2015 17:36:21
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <bits/stdc++.h>

using namespace std;
int n,v[100000],m,x,c;

int caut_bin(int nr)
{
    int st=1;
    int dr=n;
    int mij=(st+dr)/2;
    while (v[mij]!=nr)
    {
        mij=(st+dr)/2;
        if (v[st]==nr)
            return st;
        if (v[dr]==nr)
            return dr;
        if (nr>v[mij])
        {
            st=mij+1;
            continue;
        }
        else
        {
            dr=mij-1;
            continue;
        }
    }
    if (v[mij]==nr)
    {
        while (v[mij]==v[mij+1])
            ++mij;
        return mij;
    }
    else
        return -1;

}

int caut_bin_1(int nr)
{
    int st=1;
    int dr=n;
    int mij=(st+dr)/2;
    while (!(v[mij]-nr>0 || v[mij-1]-nr<0) && v[mij]!=nr)
    {
        mij=(st+dr)/2;
        if (v[mij]-nr>0)
        {
            dr=mij-1;
            continue;
        }
        else
        {
            st=mij+1;
            continue;
        }
    }
    if (v[mij]==nr)
    {
        while (v[mij]==v[mij+1])
            ++mij;
    }
    return mij;

}

int caut_bin_2(int nr)
{
    int st=1;
    int dr=n;
    int mij=(st+dr)/2;
    while (!(v[mij]-nr>0 || v[mij-1]-nr<0) && v[mij]!=nr)
    {
        mij=(st+dr)/2;
        if (v[mij]-nr>0)
        {
            st=mij+1;
            continue;
        }
        else
        {
            dr=mij-1;
            continue;
        }
    }
    if (v[mij]==nr)
    {
        while (v[mij]==v[mij-1])
            --mij;
    }
    return mij;

}
void citire()
{
    scanf("%d",&n);
    for (int i=1; i<=n; ++i)
        scanf("%d",&v[i]);
    scanf("%d",&m);
    for (int j=1; j<=m; ++j)
    {
        scanf("%d%d",&c,&x);
        if (c==0)
        {
            printf("%d\n",caut_bin(x));
            continue;
        }

        if (c==1)
        {
            printf("%d\n",caut_bin_1(x));
            continue;
        }
        if (c==2)
        {
            printf("%d\n",caut_bin_2(x));

        }
    }
}

int main()
{

    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    citire();

    return 0;
}