Cod sursa(job #1100863)

Utilizator lorundlorund lorund Data 7 februarie 2014 16:16:42
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>

int n, m;
int v[100001];

int binary_1(int x);
int binary_2(int x);
int binary_3(int x);

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

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

        scanf("%d %d", &c, &x);
        switch (c){
        case 0:
            printf("%d\n", binary_1(x)+1);
            break;
        case 1:
            printf("%d\n", binary_2(x)+1);
            break;
        case 2:
            printf("%d\n", binary_3(x)+1);
            break;
        }
    }
    return 0;
}

int binary_1(int x){
    int li=0, ls=n-1, m;

    while (li<=ls){
        m = (li+ls)/2;

        if (v[m] <= x){
            li = m+1;
        }
        else{
            ls = m-1;
        }
    }
    m = (li+ls)/2;
    if (v[m]>x)
        --m;
    if (v[m]==x)
        return m;
    return -1;
}


int binary_2(int x){
    int li=0, ls=n-1, m;

    while (li<=ls){
        int m=(li+ls)/2;

        if (v[m] <= x){
            li = m+1;
        }
        else{
            ls = m-1;
        }
    }
    m = (li+ls)/2;
    if (v[m]>x)
        --m;
    return m;
}

int binary_3(int x){
    int li=0, ls=n-1, m;

    while (li<=ls){
        int m=(li+ls)/2;

        if (v[m] >= x){
            ls = m-1;
        }
        else{
            li = m+1;
        }
    }
    m = (li+ls)/2;
    if (v[m]<x)
        ++m;
    return m;
}