Cod sursa(job #1001428)

Utilizator alexx.cosmaCosma Cristian Alexandru alexx.cosma Data 24 septembrie 2013 22:30:43
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int s[100010];
int len;
void doOp(int op, int param);

int main()
{
    int nrOp;

    fin >> len;

    for(int i=0; i<len; i++)
    {
        fin >> s[i];
    }

    fin >> nrOp;

    for(int i=0; i<nrOp; i++)
    {
        int op, param;
        fin >> op;
        fin >> param;
        doOp(op,param);
    }


    return 0;
}

void doOp(int op, int param)
{
    int mid=0,lo=0,hi=0;
    switch (op)
    {
        // cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
    case 0:
    {
        lo = 0;
        hi = len-1;
        mid = 0;
        while(lo < hi)
        {
            int tempMid = mid;
            mid = lo + (hi-lo)/2;
            if(tempMid == mid){
                break;
            }
            if(s[mid] <= param)
            {
                lo = mid;
            }
            else if(s[mid] > param)
            {
                hi = mid;
            }
        }
        if(s[mid]==param)
            cout << mid+1;
        else
            cout << -1;
        break;
    }
    // cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
    case 1:
    {
        lo = 0;
        hi = len-1;
        mid = 0;
        while(lo < hi)
        {
            int tempMid = mid;
            mid = lo + (hi-lo)/2;
            if(tempMid == mid){
                break;
            }
            if(s[mid] <= param)
            {
                lo = mid;
            }
            else if(s[mid] > param)
            {
                hi = mid;
            }
        }
        cout << mid+1;
        break;
    }
    // cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
    case 2:
    {
        lo = 0;
        hi = len-1;
        mid = 0;
        while(lo < hi)
        {
            int tempMid = mid;
            mid = lo + (hi-lo)/2;
            if(tempMid == mid){
                break;
            }
            if(s[mid] < param)
            {
                lo = mid;
            }
            else if(s[mid] >= param)
            {
                hi = mid;
            }
            if(mid != 0){
                if(s[mid-1] < param){
                    break;
                }
            }
        }
        cout << mid+1;
        break;
    }
    }
}