Cod sursa(job #1147849)

Utilizator stefan688Test Info Edu Arena stefan688 Data 20 martie 2014 10:48:33
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
using namespace std;
 
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
 
int m, type, value, n, v[100010], x;
 
void citeste() {
     fin>>n;
     for (int i = 1; i <= n; i++) {
         fin>>v[i];
     }    
      
}
 
void afiseaza_valoare() {
     fout<<x<<endl;
}
 
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 CautareMult(int st, int dr) {
    if (st > dr) {
        return -1; 
    }
          
    int mij = (st + dr) / 2;
    if (v[mij] > value) {
       return CautareMult(st, mij - 1);
    } else {
       return max(mij, CautareMult(mij + 1, dr));
    }
}
 
int CautarePutin(int st, int dr) {
    if (st > dr) {
        return -1; 
    }
      
    int mij = (st + dr) / 2;
    if (v[mij] < value) {
       return CautarePutin(mij + 1, dr);
    } else {
       return min(mij, CautarePutin(st ,mij-1));
    }
}
 
int CautareEgal(int st, int dr) {
     if (st>dr){
        return -1; 
     }
      
     int mij = (st + dr)/2;
     if (v[mij] < value) {
        return CautareEgal(mij+1,dr);         
     } else if(v[mij]>value) {
        return CautareEgal(st, mij-1);      
     } else{
        return max(mij, CautareEgal(mij+1, dr));
     }
}
 
void rezolva() {
     fin>>m;
     for (int i = 0; i < m; i++) {
         fin>>type>>value;
         switch (type) {
               case 0:
                    x = CautareEgal(1, n);
                    break;
               case 1:
                    x = CautareMult(1, n);
                    break;
               case 2:    
                    x = CautarePutin(1, n);
                    break;
               default:
                    break;
        }
         afiseaza_valoare();
     }    
}
 
int main(){
    citeste();
    rezolva();
     
    return 0;  
}