Cod sursa(job #834081)

Utilizator GriffinGriffin Griffin Data 13 decembrie 2012 18:36:31
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>

using namespace std;

const int NMAX = 100001;
const int MMAX = 100001;

const char IN[] = "cautbin.in";
const char OUT[] = "cautbin.out";

int N, M;
int A[NMAX];

int FirstSearch(int val) {
    int step, i;
    for(step = 1; step < N; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= N && A[i + step] <= val)
            i += step;

    if(A[i] == val)
        printf("%d\n", i);
    else
        printf("-1\n");
}

void SecondSearch(int val) {
    int step, i;
    for(step = 1; step < N; step <<= 1);

    for(i = 0; step; step >>= 1)
        if(i + step <= N && A[i + step] <= val)
            i += step;

    printf("%d\n", i);
}

void ThirdSearch(int val) {
    int step, pas;
    for(step = 1; step < N; step <<= 1);

    pas = step;
    if(pas > N) pas >>= 1;
    if(A[pas] < val) pas = N;

    for(; step; step >>= 1)
        if(pas - step <= N && pas >= step && A[pas - step] >= val)
            pas -= step;

    printf("%d\n", pas);
}

int main() {
    int i, val, cod;

    freopen(IN, "r", stdin);
    freopen(OUT, "w", stdout);

    scanf("%d", &N);
    for(i = 1; i <= N; ++i)
        scanf("%d", &A[i]);

    scanf("%d", &M);
    for(i = 1; i <= M; ++i) {
        scanf("%d %d", &cod, &val);

        switch(cod) {
            case 0: FirstSearch(val); break;
            case 1: SecondSearch(val); break;
            case 2: ThirdSearch(val); break;
        }
    }

    return 0;
}