Cod sursa(job #1015324)

Utilizator PsychoAlexAlexandru Buicescu PsychoAlex Data 24 octombrie 2013 13:25:44
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
#include <iostream>
#include <fstream>

std::ifstream fin("cautbin.in");
std::ofstream fout("cautbin.out");

int vec[100001], n, m, poz1;

int binSearch(int in, int sf, int val)
{
    int m;
    while(in < sf)
    {
        m = in / 2 + sf / 2;
        if(vec[m] <= val)
        {
            in = m+1;
        }
        else
        {
            sf = m-1;
        }
    }
    m = in / 2 + sf / 2;
    if(vec[m] > val)
    {
        m--;
    }

    poz1 = m;

    if(val == vec[m])
    {
        return m;
    }
    return -1;
}

void rezolvare(int x, int y)
{
    if(x == 0)
    {
        int val = binSearch(0, n-1, y);
        if(val != -1)
        {
            int i = val + 1;
            while(i < n && vec[i] == y)
            {
                i++;
            }
            fout<<i<<'\n';///il las i, pentru ca trebuie sa afisez pozitia + 1
        }
    }
    else
        if(x == 1)
        {
            int val = binSearch(0, n-1, y);
            if(val != -1)
            {
                int i = val + 1;
                while(i < n && vec[i] == y)
                {
                    i++;
                }
                fout<<i<<'\n';///il las i, pentru ca trebuie sa afisez pozitia + 1
            }
            else
            {
                int i = poz1;
                while(i >= 0 && y > vec[i])
                {
                    i--;
                }
                fout<<i + 1<<'\n';
            }
        }
        else
            if(x == 2)
            {
                int val = binSearch(0, n-1, y);
                if(val != -1)
                {
                    int i = val - 1;
                    while(i >= 0 && vec[i] == y)
                    {
                        i--;
                    }
                    fout<<i + 2<<'\n';///il las i, pentru ca trebuie sa afisez pozitia + 1
                }
                else
                {
                    int i = poz1;
                    while(i < n && y > vec[i])
                    {
                        i++;
                    }
                    fout<<i + 1<<'\n';
                }
            }
}

void citire()
{
    fin>>n;
    for(int i = 0; i < n; i++)
    {
        fin>>vec[i];
    }
    fin>>m;
    int x, y;
    for(int i = 0; i < m; i++)
    {
        fin>>x>>y;
        rezolvare(x, y);
    }
}

void rezolvare()
{
//    fout<<binSearch(0, n-1, 5) + 1;
}

int main()
{
    citire();
    rezolvare();
    return 0;
}