Cod sursa(job #764484)

Utilizator mi5humihai draghici mi5hu Data 5 iulie 2012 13:19:45
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <stdio.h>
using namespace std;

int n, v[100010];
int m, type, value;
int rez;

void citeste() {
     scanf("%d", &n);
     for (int i = 1; i <= n; i++) {
         scanf("%d", &v[i]);
     }     
     
}

void afiseaza_valoare() {
     printf("%d\n", rez);     
}

int max(int a, int b) {
    if (a == -1) {
       return b;   
    } else if (b == -1) {
       return a;
    }
    return (a > b ? a : b);
}

int min(int a, int b) {
    if (a == -1) {
       return b;   
    } else if (b == -1) {
       return a;
    }
    return (a < b ? a : b);
}

int bSearchLess(int pi, int pf) {
    if (pi > pf) {
        return -1;  
    }
         
    int pa = (pi + pf) / 2; 
    if (v[pa] > value) {
       return bSearchLess(pi, pa - 1);
    } else {
       return max(pa, bSearchLess(pa + 1, pf));
    }
}

int bSearchMore(int pi, int pf) {
    if (pi > pf) {
        return -1;  
    }
     
    int pa = (pi + pf) / 2; 
    if (v[pa] < value) {
       return bSearchMore(pa + 1, pf);
    } else {
       return min(pa, bSearchMore(pi , pa - 1));
    }
}

int bSearchEqual(int pi, int pf) {
     if (pi > pf) {
        return -1;  
     }
     
     int pa = (pi + pf)/2;
     if (v[pa] < value) {
        return bSearchEqual(pa + 1, pf);          
     } else if (v[pa] > value) {
        return bSearchEqual(pi, pa - 1);       
     } else { 
        return max(pa, bSearchEqual(pa + 1, pf));
     }
}

void rezolva() {
     scanf("%d", &m);
     for (int i = 0; i < m; i++) {
         scanf("%d%d", &type, &value); 
         switch (type) {
               case 0:
                    rez = bSearchEqual(1, n);
                    break;
               case 1:
                    rez = bSearchLess(1, n);
                    break;
               case 2:     
                    rez = bSearchMore(1, n);
                    break;
               default:
                    break;              
        } 
         afiseaza_valoare(); 
     }     
}

int main(){
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    
    citeste();
    rezolva();
    
    return 0;   
}