Cod sursa(job #1232126)

Utilizator thinkphpAdrian Statescu thinkphp Data 22 septembrie 2014 09:30:57
Problema Cautare binara Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 3.09 kb
#include <stdio.h>
#define FIN "cautbin.in"
#define FOUT "cautbin.out"
#define MAXN 100001

int n, 
    vec[ MAXN ],
    num_questions;

int request(int li, int ls, int what) {

    int pos = -1, found = 0;

      int middle;

      while( li <= ls && !found )  {

          middle = (li + ls) >> 1;

          if( vec[ middle ] > what) {

               ls = middle - 1;

          } else if(vec[ middle ] < what) {

               li = middle + 1;

          } else { 
                   pos = middle; 

                   found = 1;

                   while(vec[ pos ] == what) {

                         pos++; 
                   }

                 }
       }

    return pos; 
};

int request0(int li, int ls, int what) {

    int pos = -1;

      int middle;

      while(li <= ls) {
 
            middle = (li + ls) >> 1;
    
            if( vec[ middle ] == what) {

                pos = middle;

                li = middle + 1;

            } else {

              if( what < vec[ middle ] ) {

                  ls = middle - 1;

              } else {

                  li = middle + 1;
              } 

            } 
      }

    return pos; 
};


int request1(int li, int ls, int what) {

    int pos = -1;

      int middle;

      while(li <= ls) {
 
            middle = (li + ls) >> 1;
    
            if( vec[ middle ] == what || vec[ middle ] <= what) {

                pos = middle;

                li = middle + 1;

            } else {

              if( what < vec[ middle ] ) {

                  ls = middle - 1;

              } else {

                  li = middle + 1;
              } 

            } 
      }

    return pos; 
};


int request2(int li, int ls, int what) {

    int pos = -1;

      int middle;

      while(li <= ls) {
 
            middle = (li + ls) >> 1;
    
            if( vec[ middle ] == what || vec[ middle ] >= what) {

                pos = middle;

                ls = middle - 1;

            } else {

              if( what < vec[ middle ] ) {

                  ls = middle - 1;

              } else {

                  li = middle + 1;
              } 

            } 
      }

    return pos; 
};

void solve() {

     int i, 
         op, 
         j;

     freopen(FIN, "r", stdin);

     freopen(FOUT, "w", stdout);

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

     scanf("%d", &num_questions);

     for(; num_questions; num_questions--) {

           scanf("%d %d", &op, &j);

           switch( op ) {

                   case 0: 
                   printf("%d\n", request0(1,n,j));   
                   break; 

                   case 1: 
                   printf("%d\n", request1(1,n,j));   
                   break;

                   case 2: 
                   printf("%d\n", request2(1,n,j));   
                   break; 
           }

     }
 
     fclose( stdin );

     fclose( stdout );
};

int main() {

    solve();
    
    return(0);
}