Cod sursa(job #1263132)

Utilizator MarianMMorosac George Marian MarianM Data 13 noiembrie 2014 23:07:51
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#define _CRT_SECURE_NO_DEPRECATE

#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <list>
#include <string>
#include <iterator>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstring>
using namespace std;

#define DMAX 100003
#define MOD  1000003
#define min(a,b) a>b ? b : a
#define max(a,b) a<b ? b : a

int N, M, X;
vector<int> V(DMAX);

int findX(int st, int dr){
	int mij = (st + dr + 1) / 2;
	if		(st > dr)	return -1;
	else if (st == dr)	return V[st] == X ? st : -1;
	else{
		if (X >= V[mij])	return findX(mij, dr);
		else				return findX(st, mij - 1);
	}
}

int uprbnd(int st, int dr){
	int mij = (st + dr - 1) / 2;
	if (st >= dr)	return dr;
	else{
		if (X <= V[mij])	return uprbnd(st, mij);
		else				return uprbnd(mij + 1, dr);
	}
}

int lwrbnd(int st, int dr){
	int mij = (st + dr + 1) / 2;
	if (st >= dr)	return st;
	else{
		if (X >= V[mij])	return lwrbnd(mij, dr);
		else				return lwrbnd(st, mij - 1);
	}
}

int main(){
	int i, j;

	freopen("cautbin.in", "r", stdin); // test
	freopen("cautbin.out", "w", stdout); // cautbin

	scanf("%d", &N); 
	for (i = 1; i <= N; i++) scanf("%d", &V[i]);
	
	scanf("%d", &M);
	while (M--){
		scanf("%d %d", &i, &X);
		switch (i){
			case 0: printf("%d\n", findX(1, N)); break;
			case 1: printf("%d\n", lwrbnd(1, N)); break;
			case 2: printf("%d\n", uprbnd(1, N)); break;
			default: break;
		}
	}

	
	return 0;
}