Cod sursa(job #1987998)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 1 iunie 2017 20:05:49
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
// cautbin.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <fstream>
#define MAXN 10005
#define MAX(a,b) ( (a) > (b) ? (a) : (b))

using namespace std;

ifstream in("cautbin.in");
ofstream out("cautbin.out");

int N, M, v[MAXN],mid,st,dr,a,nr;

//void cit() {
//	in >> N;
//	for (int i = 1; i <= N; i++) {
//		in >> v[i];
//	}
//
//}
//int cautbin_0(int nr) {
//	int mid, st = 1, dr = N;
//	while (st <= dr) {
//
//		mid = (st + dr) / 2;
//		if (v[mid] > nr) {
//			dr = mid - 1;
//		}
//		else if (v[mid] <= nr) {
//			st = mid + 1;
//		}
//	}
//	mid = (st + dr) / 2;
//	if (v[dr] == nr) {
//		return dr;
//	}
//	else {
//		return -1;
//	}
//}
//int cautbin_1(int nr) {
//	int mid, st = 1, dr = N;
//	while (st <= dr) {
//
//		mid = (st + dr) / 2;
//		if (v[mid] > nr) {
//			dr = mid - 1;
//		}
//		else if (v[mid] <= nr) {
//			st = mid  + 1;
//		}
//	}
//	mid = (st + dr) / 2;
//	return dr;
//	
//}
//int cautbin_2(int nr) {
//	int mid, st = 1, dr = N;
//	while (st <= dr) {
//
//		mid = (st + dr) / 2;
//		if (v[mid] >= nr) {
//			dr = mid - 1;
//		}
//		else if (v[mid] < nr) {
//			st = mid + 1;
//		}
//	}
//	mid = (st + dr) / 2;
//	return st;
//}

int main()
{
	in >> N;
	for (int i = 1; i <= N; i++) {
		in >> v[i];
	}
	in >> M;
	for (int i = 1; i <= M; i++) {
		
		in >> a >> nr;
		if (a == 0) {
			mid, st = 1, dr = N;
			while (st <= dr) {

				mid = (st + dr) / 2;
				if (v[mid] > nr) {
					dr = mid - 1;
				}
				else if (v[mid] <= nr) {
					st = mid + 1;
				}
			}
			mid = (st + dr) / 2;
			if (v[dr] == nr) {
				out<< dr <<"\n";
			}
			else {
				out<<-1<<"\n";
			}
		}
		else if (a == 1) {
			mid, st = 1, dr = N;
			while (st <= dr) {

				mid = (st + dr) / 2;
				if (v[mid] > nr) {
					dr = mid - 1;
				}
				else if (v[mid] <= nr) {
					st = mid + 1;
				}
			}
			mid = (st + dr) / 2;
			out<< dr<<"\n";
		}
		else if(a == 2) {
			mid, st = 1, dr = N;
			while (st <= dr) {

				mid = (st + dr) / 2;
				if (v[mid] >= nr) {
					dr = mid - 1;
				}
				else if (v[mid] < nr) {
					st = mid + 1;
				}
			}
			mid = (st + dr) / 2;
			out<< st<<"\n";
		}
	}
	return 0;
}