Cod sursa(job #2666588)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 2 noiembrie 2020 10:51:01
Problema Cautare binara Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;
int n, m, x, p, v[100005];
void caut0(int a)
{
    int st = 1, dr = n, mijloc;
    while(dr - st > 1){
        mijloc = (st + dr)/2;
        if (v[mijloc] > a){
            dr = mijloc;
        }else{
            st = mijloc;
        }
    }
    if (v[st] > a)
        st --;

    if (a == v[st]){
        printf("%d\n", st);
    }else{
        printf("%d\n", -1);
    }
}
void caut1(int a)
{
    int st = 1, dr = n, mijloc;
    while(dr - st > 1){
        mijloc = (st + dr)/2;
        if (v[mijloc] > a){
            dr = mijloc;
        }else{
            st = mijloc;
        }
    }
    if (v[st] > a)
        st --;
    printf("%d\n", st);
}
void caut2(int a)
{
    int st = 1, dr = n, mijloc;
    while(dr - st > 1){
        mijloc = (st + dr)/2;
        if (v[mijloc] >= a){
            dr = mijloc;
        }else{
            st = mijloc;
        }
    }
    if (v[st] < a)
        st ++;
    printf("%d\n", st);
}
int main() {
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);

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

    scanf("%d", &m);
    for (int i=1;i<=m;i++){
        scanf("%d%d", &p, &x);
        if (p == 0){
            caut0(x);
        }else if (p == 1){
            caut1(x);
        }else{
            caut2(x);
        }
    }
    return 0;
}