Cod sursa(job #1971164)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 19 aprilie 2017 21:39:05
Problema Cautare binara Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.44 kb
#include <stdio.h>
#include <stdlib.h>
#define put 131072

int n, v[100001];

int x0 ( int x ) {
    int r, pas;
    r = 1;
    pas = put;
    while( pas > 0 ) {
        if( r + pas <= n && v[r + pas] <= x ) {
            r += pas;
        }
        pas /= 2;
    }
    if( v[r] != x ) {
        r = -1;
    }
    return r;
};

int x1 ( int x ) {
    int r, pas;
    r = 1;
    pas = put;
    while( pas > 0 ) {
        if( r + pas <= n && v[r + pas] <= x ) {
            r += pas;
        }
        pas /= 2;
    }
    return r;
};

int x2 ( int x ) {
    int r, pas;
    r = 1;
    pas = put;
    while( pas > 0 ) {
        if( r + pas <= n && v[r + pas] < x ) {
            r += pas;
        }
        pas /= 2;
    }
    return r + 1;
};

int cr ( int c, int x ) {
    switch( c ) {
    case 0 :
        return x0( x );
        break;
    case 1 :
        return x1( x );
        break;
    case 2 :
        return x2( x );
    }
    return 0;
}

int main() {
    FILE *fin, *fout;
    int i, m, x, c;
    fin = fopen( "cautbin.in", "r" );
    fout = fopen( "cautbin.out", "w" );
    fscanf( fin, "%d", &n );
    for( i = 1; i <= n; i++ ) {
        fscanf( fin, "%d", &v[i] );
    }
    fscanf( fin, "%d", &m );
    for( i = 0; i < m; i++ ) {
        fscanf( fin, "%d%d", &c, &x );
        fprintf( fout, "%d\n", cr( c, x ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}