Cod sursa(job #1796972)

Utilizator maryan_lupMarian Lupascu maryan_lup Data 3 noiembrie 2016 21:53:50
Problema Cautare binara Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define DIMMAX 100005
#define ll long long
#define FOR(i, a, b) for(int i = a; i <= b; i++)

using namespace std;

ll N, M;
int a[DIMMAX];

ifstream f("cautbin.in");
void citire()
{
    f>>N;
    FOR(i, 1, N)
    {
        f>>a[i];
    }
    f>>M;
}

ofstream g("cautbin.out");

void afisare(int x)
{
    g<<x<<'\n';
}

int binary_search(int s, int d, int val)
{
    int mij;
    if(s<=d)
    {
        mij=(s+d)/2;
        if(val<a[mij])binary_search(s,mij-1,val);
        else
            if(val>a[mij])binary_search(mij+1,d,val);
            else
                return mij;
    }
    else
        return -(s+d)/2;
}

int main()
{
    citire();

    FOR(i,1,M)
    {
        int tip,val;
        f>>tip>>val;
        if(tip==0)
        {
            int aux=binary_search(1,N,val);
            if(aux<0)
                afisare(-1);
            else
            {
                int j=aux;
                while(a[++j]==a[aux]);
                afisare(j-1);
            }
        }
        else
            if(tip==1)
            {
                int aux=binary_search(1,N,val);
                if(aux<0)
                {
                    afisare(-aux);
                }
                else
                {
                    int j=1;
                    while(a[aux]==a[aux+j])
                    {
                        j++;
                    }
                    afisare(aux+j-1);
                }
            }
            else
            {
                int aux=binary_search(1,N,val);
                if(aux<0)
                {
                    afisare(-aux+1);
                }
                else
                {
                    int j=1;
                    while(a[aux]==a[aux-j])
                    {
                        j++;
                    }
                    afisare(aux-j+1);
                }
            }
    }

    g.close();
    f.close();

    return 0;
}