Cod sursa(job #2462383)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 27 septembrie 2019 11:01:01
Problema Cautare binara Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.68 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
#define MAX_SIZE 100010
int n, m, i, j, c, val, rasp, in, sf, mid;
int v[MAX_SIZE];

int Find0(int val) {
    in = 1;
    sf = n;
    mid = (in+sf)/2;
    rasp = -1;
    ///cout << in << ' ' << mid << ' ' << sf << '\n';
    while(in != sf) {
        if(v[mid] == val) {
            if(in != mid){
                rasp = mid;
                in = mid;
                mid = (in+sf)/2;
            } else {
                sf = mid;
                mid = (in+sf)/2;
            }
        } else if(v[mid] < val) {
            if(in != mid) {
                in = mid;
                mid = (in+sf)/2;
            } else {
                sf = mid;
                mid = (in+sf)/2;
            }
        } else if(v[mid] > val) {
            sf = mid;
            mid = (in+sf)/2;
        }
        ///cout << in << ' ' << mid << ' ' << sf << '\n';
    }
    return rasp;
}

int Find1(int val) {
    in = 1;
    sf = n;
    mid = (in+sf)/2;
    rasp = -1;
    ///cout << in << ' ' << mid << ' ' << sf << '\n';
    while(in != sf) {
        if(v[mid] <= val) {
            rasp = mid;
            if(in != mid){
                in = mid;
                mid = (in+sf)/2;
            } else {
                sf = mid;
                mid = (in+sf)/2;
            }
        } else if(v[mid] > val) {
            sf = mid;
            mid = (in+sf)/2;
        }
        ///cout << in << ' ' << mid << ' ' << sf << '\n';
    }
    return rasp;
}

int Find2(int val) {
    in = 1;
    sf = n;
    mid = (in+sf)/2;
    rasp = -1;
    ///cout << in << ' ' << mid << ' ' << sf << '\n';
    while(in != sf) {
        if(v[mid] >= val) {
            rasp = mid;
            sf = mid;
            mid = (in+sf)/2;
        } else if(v[mid] < val) {
            if(in != mid) {
                in = mid;
                mid = (in+sf)/2;
            } else {
                in = mid+1;
                mid = (in+sf)/2;
                if(v[mid] >= val)
                    rasp = mid;
            }
        }
        ///cout << in << ' ' << mid << ' ' << sf << '\n';
    }
    return rasp;
}

int main()
{
    f >> n;
    for(i = 1; i <= n; i++) {
        f >> v[i];
        ///cout << v[i] << ' ';
    }
    ///cout << '\n';

    f >> m;
    for(i = 1; i <= m; i++) {
        f >> c >> val;
        if(c == 0)
           rasp = Find0(val);
        else if(c == 1)
            rasp = Find1(val);
        else if(c == 2)
            rasp = Find2(val);


        g << rasp << '\n';
        ///cout << '\n';
    }
    return 0;
}