Cod sursa(job #1798675)

Utilizator priboiraduPriboi Radu Bogdan priboiradu Data 5 noiembrie 2016 12:46:38
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>
#include <stdlib.h>
#define L 17

int v[100001];

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

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

int main() {
    FILE *fin, *fout;
    int n, i, m, q, x, cb;
    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", &q, &x );
        switch( q ) {
            case 0:
                cb = cautareBinara( n, x );
                if ( v[cb] == x )
                    fprintf( fout, "%d\n", cb );
                else
                    fprintf( fout, "-1" );
                break;
            case 1:
                fprintf( fout, "%d\n", cautareBinara( n, x ) );
                break;
            case 2:
                fprintf( fout, "%d\n", cautareBinaraMin( n, x ) );
                break;
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}