Cod sursa(job #3288478)

Utilizator christalknightChristian Micea christalknight Data 22 martie 2025 15:18:34
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
/*
 * https://www.infoarena.ro/problema/cautbin
 */

#include <iostream>
#include <fstream>

#define MAXN 100005

using namespace std;

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

void readElements(int& n, int sir[]);
void solveProblem(int n, int sir[]);
int bitBinarySearch(int n, int sir[], int k);
bool condition(int idx, int sir[], int k);

int main()
{
    int n = 0;
    int sir[MAXN];

    readElements(n, sir);

    //  for (int i = 0; i < n; i++)
    //      std::fout<<sir[i]<<" ";
    //
    // fout<<"\n";

    solveProblem(n, sir);

    fclose(fin);
    fclose(fout);
    return 0;
}

void readElements(int& n, int sir[])
{
    fin>>n;
    for (int i = 0; i < n; i++)
        fin>>sir[i];
}

void solveProblem(int n, int sir[])
{
    int m, i, qType, qVal, temp;
    fin>>m;

    for (i = 0 ; i < m; i++) {
        fin>>qType>>qVal;

        switch (qType) {
            case 0:
                temp = bitBinarySearch(n, sir, qVal);

                if (sir[temp] == qVal)
                    fout<<temp + 1<<'\n';
                else
                    fout<<"-1\n";

                break;
            case 1:
                fout<<bitBinarySearch(n, sir, qVal) + 1<<'\n';
                break;
            case 2:
                fout<<bitBinarySearch(n, sir, qVal) + 2<<'\n';
                break;
            default:
                fout<<"unknown operation\n";
                break;
        }
    }
}

int bitBinarySearch(int n, int sir[], int k)
{
    int acc = 0;
    int currPow2 = 1;
    while (currPow2 < n)
        currPow2 <<= 1;
    currPow2 >>= 1;

    while (currPow2 > 0) {
        if (condition(currPow2, sir, k)) {
            acc += currPow2;
        }
        currPow2 >>= 1;
    }

    return acc;
}

bool condition(int idx, int sir[], int k)
{
    return sir[idx] <= k;
}