Cod sursa(job #2462400)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 27 septembrie 2019 11:32:10
Problema Cautare binara Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.03 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];

void SearchLeft(int &in, int &mid, int &sf) {
    sf = mid;
    mid = (in+sf)/2;
}

void SearchRight(int &in, int &mid, int &sf) {
    in = mid;
    mid = (in+sf)/2;
}

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;
                SearchRight(in, mid, sf);
            }
            else
                SearchLeft(in, mid, sf);
        } else if(v[mid] < val) {
            if(in != mid)
                SearchRight(in, mid, sf);
            else
                SearchLeft(in, mid, sf);
        }
        else if(v[mid] > val)
            SearchLeft(in, mid, sf);

        if(v[mid] == val)
            rasp = mid;
        ///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)
                SearchRight(in, mid, sf);
            else {
                mid += 1;
                SearchRight(in, mid, sf);
                if(v[mid] <= val)
                    rasp = mid;
            }
        } else if(v[mid] > val) {
            if(sf != mid)
                SearchLeft(in, mid, sf);
            else {
                mid -= 1;
                SearchRight(in, mid, sf);
            }
        }

        if(v[mid] <= val)
                rasp = mid;
        ///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;
            SearchLeft(in, mid, sf);
        } else if(v[mid] < val) {
            if(in != mid) {
                SearchRight(in, mid, sf);
            } else {
                mid += 1;
                SearchRight(in, mid, sf);
                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;
        ///cout << i << '\n';
        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;
}