Cod sursa(job #1809427)

Utilizator delia_ioanaCeapa Delia Ioana delia_ioana Data 18 noiembrie 2016 22:28:04
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <math.h>
#include <climits>

using namespace std;

int n, m, t, op;

int upperBound(vector<int> &v, int start, int end, int val) {
	int middle = (end - start) / 2 + start;
	
	if (start == end) {
		if (v[start] == val) return start;
		return -2;
	}
	if (start == end - 1) {
		if (v[end] == val) return end;
		if (v[start] == val) return start;
		return -2;
	}

	if (v[middle] > val) return upperBound(v, start, middle, val);
	return upperBound(v, middle, end, val);

}

int upperBound2(vector<int> &v, int start, int end, int val) {
	int middle = (end - start) / 2 + start;

	if (start == end) {
		if (v[start] <= val) return start;
		return -2;
	}
	if (start == end - 1) {
		if (v[end] <= val) return end;
		if (v[start] <= val) return start;
		return -2;
	}

	if (v[middle] > val) return upperBound2(v, start, middle, val);
	return upperBound2(v, middle, end, val);

}

int lowerBound(vector<int> &v, int start, int end, int val) {
	int middle = (end - start) / 2 + start;

	if (start == end) {
		if (v[start] >= val) return start;
		return -2;
	}
	if (start == end - 1) {
		if (v[start] >= val) return start;
		if (v[end] >= val) return end;
		return -2;
	}

	if (v[middle] >= val) return lowerBound(v, start, middle, val);
	return lowerBound(v, middle, end, val);

}

int main()
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    scanf("%d", &n);

    vector<int> v;
    for (int i = 0; i < n; i ++) {
    		scanf("%d", &t);
    		v.push_back(t);
    }

    scanf("%d", &m);
    for (int i = 0; i < m; i ++) {
    	scanf("%d %d", &op, &t);
    	if (op == 0) {
    		int sol = upperBound(v, 0, v.size() - 1, t);
    		printf("%d\n", sol + 1);
    	} else if (op == 1) {
    		int sol = upperBound2(v, 0, v.size() - 1, t);
    		printf("%d\n", sol + 1);
    	} else if (op == 2) {
    		int sol = lowerBound(v, 0, v.size() - 1, t);
    		printf("%d\n", sol + 1);
    	}

    }

    return 0;
}