Cod sursa(job #2897795)

Utilizator Anitsirc49000Mircea Manolescu Anitsirc49000 Data 4 mai 2022 20:26:59
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3 kb
#include <bits/stdc++.h>
using namespace std;

class Task {
public:
    void solve() {
        read_input();
        print_output(get_result());
    }

private:
   //declare global variables here
    int N, M;
    vector<int> array;
    vector<tuple<int, int>> questions;

    void read_input() {
        ifstream fin("cautbin.in");
        fin >> N;
        int x, y;
       // printf("N = %d\n", N);
        for(int i = 0; i < N; i++) {
            fin >> x;
            array.push_back(x);
        }
        //  for(int i = 0; i < N; i++) {
        //      printf("%d ", array[i]);
        //  }
         cout << endl;
        fin >> M;
        for(int i = 0; i < M; i++) {
            fin >> x >> y;
            questions.push_back(make_tuple(x, y));
          //  printf("%d %d\n", x, y);
        }
       
        fin.close();
    }

    int get_result() {
        int idx;
       for(int i = 0; i < M; i++) {
           int type = get<0>(questions[i]);
           int x = get<1>(questions[i]);
           switch(type) {
               case 0:
                    idx = binarySearch0(x, 0, N);
                    printf("%d\n", idx + 1);
                    break;
                case 1:
                    idx = binarySearch1(x, 0, N);
                    printf("%d\n", idx + 1);
                    break;
                case 2:
                    idx = binarySearch2(x, 0, N);
                    printf("%d\n", idx + 1);
                    break;
                default:
                    break;
           }
       }
       return idx;
    }

   int binarySearch0(int x, int left, int right) {
       int mid,idx;
       while(left <= right) {
           mid = (left + right)/2;
//printf("comp %d at %d\n", array[mid], mid);
           if(x == array[mid]) {
              idx = mid;
               left = mid + 1;
           }
            if(x < array[mid])
                right = mid - 1;
            if(x > array[mid])
                left = mid + 1;
       }
      
            return idx;
      
   }
     int binarySearch1(int x, int left, int right) {
       int mid, idx;
       while(left <= right) {
           mid = (left + right)/2;
           if(array[mid] <= x) {
               idx = mid;
               left = mid + 1;
           }
           if(array[mid] > x) {
               right = mid - 1;
           }
       }
       return idx;
     }
     int binarySearch2(int x, int left, int right) {
       int mid, idx;
       while(left <= right) {
           
           mid = (left + right)/2;
          // printf("comp %d at %d\n", array[mid], mid);
           if(array[mid] >= x) {
               idx = mid;
               right = mid - 1;
             //  printf("yes %d\n", idx);
           }
           else {
               left = mid + 1;
           }
       }
       return idx;
     }
    void print_output(int idx) {
        
        
    }
};

//
int main() {
   auto* task = new (nothrow) Task(); // hint: cppreference/nothrow
    if (!task) {
        return -1;
    }
    task->solve();
    delete task;
    return 0;
}