Cod sursa(job #1909040)

Utilizator geek_geekGeek Geek geek_geek Data 7 martie 2017 11:29:34
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <iostream>
using namespace std;

int equal(int v[100000], int st, int dr, int x) {
	int mij = st + (dr - st) / 2;
	if(st > dr) {
		return -1;
	}
	if(v[mij] == x && v[mij+1] != x)
		return mij;
	else
		if(v[mij] == x || v[mij] < x) {
			return equal(v, mij + 1, dr, x);
		}
		else
			return equal(v, st, mij - 1, x);
}

int lower(int v[100000], int st, int dr, int x) {
	int mij = st + (dr - st) / 2;
	if(st > dr)
		return dr;
	if(v[mij] <= x && v[mij+1] > x)
		return mij;
	else
		if(v[mij] <= x) {
			return lower(v, mij + 1, dr, x);
		}
		else
			return lower(v, st, mij - 1, x);
}

int great(int v[100000], int st, int dr, int x) {
	int mij = st + (dr - st) / 2;
	if(st > dr)
		return dr;
	if(v[mij] >= x && v[mij-1] < x) {
		return mij;
	}
	else
		if(v[mij] < x) {
			return great(v, mij + 1, dr, x);
		}
		else {
			return great(v, st, mij - 1, x);	
		}
}

int main() {
	int n, v[100000], m, operatie, numar;
	ifstream f("cautbin.in");
	ofstream g("cautbin.out");
	f >> n;
	for(int i = 0; i < n; i++) {
		f >> v[i];
	}
	f >> m;
	for(int i = 0; i < m; i++) {
		f >> operatie >> numar;
		if(operatie == 0) {
			if(equal(v, 0, n - 1, numar) != -1)
				g << equal(v, 0, n - 1, numar) + 1 << endl;
			else
				g<< "-1" << endl;
			continue;
		}
		if(operatie == 1) {
			g << lower(v, 0, n - 1, numar) + 1 << endl;
		}
		if(operatie == 2) {
			g << great(v, 0, n - 1, numar) + 1 << endl;
		}
	}
	return 0;
}