Cod sursa(job #1119215)

Utilizator vlad.rusu11Rusu Vlad vlad.rusu11 Data 24 februarie 2014 16:16:44
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <fstream>
#define NMax 100001
using namespace std;

int N, M, v[NMax];

int opcode_0(int x)
{
    int left, right, middle;
    left = 1;
    right = N;
    middle = (left + right) / 2;
    while(v[middle] != x && left < right)
    {
        if(x < v[middle])
            right = middle;
        else
            left = middle;
        middle = (left + right) / 2;
    }
    if(v[middle] == x)
    {
        while(v[middle + 1] == x)
            ++middle;
        return middle;
    }
    return -1;
}

int opcode_1(int x)
{
    int left, right, middle;
    left = 1;
    right = N;
    middle = (left  + right) / 2;
    while(v[middle] != x && left < right)
    {
        if(x < v[middle])
            right = middle;
        else
            left = middle;
        middle = (left + right) / 2;
    }
    while(v[middle] <= x)
        ++middle;
    return middle - 1;
}

int opcode_2(int x)
{
    int left, right, middle;
    left = 1;
    right = N;
    middle = (left + right) / 2;
    while(v[middle] != x && left < right)
    {
        if(x < v[middle])
            right = middle;
        else
            left = middle;
        middle = (left + right) / 2;
    }
    while(v[middle] >= x)
        --middle;
    return middle + 1;
}

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

    int i, val, opcode;

    fin >> N;
    for(i=1 ; i<=N ; ++i)
        fin >> v[i];

    fin >> M;
    for(i=1 ; i<=M ; ++i)
    {
        fin >> opcode >> val;
        switch(opcode)
        {
            case 0: fout << opcode_0(val) << '\n'; break;
            case 1: fout << opcode_1(val) << '\n'; break;
            case 2: fout << opcode_2(val) << '\n'; break;
        }
    }

    fin.close();
    fout.close();
    return 0;
}