Cod sursa(job #994736)

Utilizator nicuvladNicu Vlad nicuvlad Data 6 septembrie 2013 10:29:24
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream>
#define dmax 100003
#define N 1<<17

using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n, m;
int array[dmax];
int binary_search(int val)
{
    int i, step;
    for (step = 1; step < n+1; step <<= 1);
    for (i = 0; step; step >>= 1)
    if (i + step < n+1 && array[i + step] <= val)
    i += step;
    return i;
}
/*int binary_search(int nr)

    {
        int lo = 1;
        int hi = n;
        int mid;
        while(lo <= hi)
        {
             mid = lo + (hi-lo)/2;
             if(array[mid] == nr)  return mid;
             else if(array[mid] < nr) lo = mid+1;
             else if(array[mid] > nr)   hi = mid-1;
        }     return mid;
    }*/
int main()
{
    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>array[i];
    fin>>m;
    for(int i=1; i<=m; i++)
    {
        int op,nr;
        fin>>op>>nr;
        int index = binary_search(nr);
        if(op == 0)
        {
            while(array[index+1] == nr && index < n) index++;
            if(array[index] == nr)
            fout<<index<<'\n';
            else fout<<"-1\n";
        }
        else if(op == 1)
        {
            while(array[index+1] == nr && index < n) index++;
            while(array[index] > nr && index > 1)  index--;
            fout<<index<<'\n';
        }
        else if(op == 2)
        {
            while(array[index-1] == nr && index > 1)  index--;
            while(array[index] < nr && index < n)   index++;
            fout<<index<<'\n';
        }
    }
}