Cod sursa(job #2154077)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 6 martie 2018 18:11:26
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>

using namespace std;

int sir[100005];
int n, m;

int bs1(int x){
    int putere;
    int sol;

    for(putere = 1; putere < n; putere <<= 1);
    for(sol = 0; putere >= 1; putere >>= 1){
        if(putere + sol <= n && sir[sol + putere] <= x){
            sol += putere;
        }
    }

    if(sol == 0 || sir[sol] != x){
        return -1;
    }
    else{
        return sol;
    }
}

int bs3(int x){
    int putere;
    int sol;
    x--;

    for(putere = 1; putere < n; putere <<= 1);
    for(sol = 0; putere >= 1; putere >>= 1){
        if(putere + sol <= n && sir[sol + putere] <= x){
            sol += putere;
        }
    }

    if(sir[sol] == x){
        return sol;
    }
    sol++;
    if(sol > n || sir[sol] < x){
        return -1;
    }
    else{
        return sol;
    }
}

int bs2(int x){
    int putere;
    int sol;

    for(putere = 1; putere < n; putere <<= 1);
    for(sol = 0; putere >= 1; putere >>= 1){
        if(putere + sol <= n && sir[sol + putere] <= x){
            sol += putere;
        }
    }

    if(sol == 0 || sir[sol] > x){
        return -1;
    }
    else{
        return sol;
    }
}

int main()
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);

    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &sir[i]);
    }

    scanf("%d", &m);

    int x, y;

    for(int k = 0; k < m; k++){
        scanf("%d %d", &x, &y);

        if(x == 0){
            printf("%d\n", bs1(y));
        }
        if(x == 1){
            printf("%d\n", bs2(y));
        }
        if(x == 2){
            printf("%d\n", bs3(y));
        }
    }

    return 0;
}