Cod sursa(job #1576412)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 22 ianuarie 2016 13:56:36
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int NMax = 100005;

int n, m, a[NMax];

void Exist(int s, int d, int x)
{
    if(s <= d)
    {
        bool sw = 0;
        int m = (s+d)/2;
        if((a[m] == x && a[m+1] != x && m+1 <= n) || (a[m] == x && m+1 > n))
        {
                g<<m<<'\n';
                sw = 1;
        }
        if(sw == 0)
        {
            if(a[m] < x) Exist(s,m-1,x);
            else Exist(m,d,x);
        }
    }
}

void Small(int s, int d, int x)
{
    if(s <= d)
    {
        bool sw = 0;
        int m = (s+d)/2;
        if((a[m] <= x && a[m+1] > x && m+1 <= n) || (a[m] <= x && m+1 > n))
        {
                g<<m<<'\n';
                sw = 1;
        }
        if(sw == 0)
        {
            if(a[m] < x)Small(s,m-1,x);
            else Small(m,d,x);
        }
    }
}

void Big(int s, int d, int x)
{
    if(s <= d)
    {
        bool sw = 0;
        int m = (s+d)/2;
        if((a[m] >= x && a[m-1] < x && m-1 >= 1) || (a[m] >= x && m-1 < 1 ))
        {
                g<<m<<'\n';
                sw = 1;
        }
        if(sw == 0)
        {
            if(a[m] <= x) Big(s,m,x);
            else Big(m+1,d,x);
        }
    }
}

void Solve()
{
    int job, x;
    while(m--)
    {
        f>>job>>x;
        if(job == 0) Exist(1,n,x);
        if(job == 1) Small(1,n,x);
        if(job == 2) Big(1,n,x);
    }
}

void Read()
{
    f>>n;
    for(int i = 1; i <= n; i++) f>>a[i];
    f>>m;
}

int main()
{
    Read();
    Solve();
    return 0;
}