Cod sursa(job #1074315)

Utilizator impulseBagu Alexandru impulse Data 7 ianuarie 2014 15:54:34
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.27 kb
//
//  main.c
//  cautbin
//
//  Created by Alexandru Bâgu on 1/7/14.
//  Copyright (c) 2014 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>

int binsea2(int *v, int n, int x)
{
    int i, k = 1 << 30;
    for(i = 0; i < n && k > 0; k >>= 1)
        if(i + k < n)
            if(v[i + k] <= x)
                i += k;
    return i + 1;
}
int binsea1(int *v, int n, int x)
{
    int i = binsea2(v, n, x) - 1;
    if(v[i] != x) return -1;
    return i + 1;
}

int binsea3(int *v, int n, int x)
{
    int i, k = 1 << 30;
    for(i = 0; i < n && k >= 0; k >>= 1)
        if(i + k < n)
            if(v[i + k] < x)
                return i + 2;
    return 0;
}

int validate1(int *v, int i, int x)
{
    if(v[i] == x) return i + 1;
    else return -1;
}

int main(int argc, const char * argv[])
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    int n, i, q;
    scanf("%d", &n);
    int *v = (int*)malloc(n * sizeof(int));
    for(i = 0; i < n; i++)
        scanf("%d", v + i);
    scanf("%d", &q);
    int a, x;
    for(i = 0; i < q; i++)
    {
        scanf("%d %d", &a, &x);
        if(a == 0) printf("%d\n", binsea1(v, n, x));
        else if(a == 1) printf("%d\n", binsea2(v, n, x));
        else printf("%d\n", binsea3(v, n, x));
    }
    return 0;
}