Cod sursa(job #1232131)

Utilizator thinkphpAdrian Statescu thinkphp Data 22 septembrie 2014 09:42:50
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 3.36 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, 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 { 

                   found = 1;

                   while(vec[ middle + 1 ] == what) {
  
                         pos = middle + 1;
 
                         middle++; 
                   }

                 }
       }

    return pos; 

};


int request1(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 { 

                   found = 1;

                   while(vec[ middle + 1 ] <= what) {

                         pos = middle + 1;

                         middle++; 
                   }

                 }
       }

    return pos; 

};


int request2(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 { 
                   
                   found = 1;

                   while(vec[ middle - 1 ] >= what) {

                         pos = middle - 1;

                         middle--; 
                   }

                 }
       }

    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);
}