Cod sursa(job #3295648)

Utilizator anamarias12Serbanoiu Ana-Maria anamarias12 Data 7 mai 2025 16:57:07
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int CautBin0(int x, vector<int> &v, int st, int dr) {
	// eu vreau cea mai mare pozitie
	int poz = -1;
	while (dr >= st) {
		int mid = st + (dr - st) / 2;
		if (v[mid] == x) {
			poz = mid;
			st = mid + 1;
			// ma mut mai la drepta
		}
		if (v[mid] > x) {
			// caut la stanga
			dr = mid - 1;
		}
		if (v[mid] < x) {
			// caut la dreapta
			st = mid + 1;
		}
	}
	return poz;
}

int CautBin1(int x, vector<int> &v, int st, int dr) {
	// cea mai mare pozitie pe care se afla un elem cu val <= x
	int poz = -1;
	while (dr >= st) {
		int mid = st + (dr - st) / 2;
		if (v[mid] <= x) {
			poz = mid;
			st = mid + 1;
		}
		if (v[mid] > x) {
			// caut la stanga
			dr = mid - 1;
		}
	}
	return poz;
}

int CautBin2(int x, vector<int> &v, int st, int dr) {
	// cea mai mica pozitie pe care se afla un elem cu val >= x
	int poz;
	while (dr >= st) {
		int mid = st + (dr - st) / 2;
		if (v[mid] >= x) {
			poz = mid;
			dr = mid - 1;
		}
		if (v[mid] < x) {
			// caut la dreapta
			st = mid + 1;
		}
	}
	return poz;
}

int main() {
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);

	int N, M, x;
	// citim N
	cin >> N;
	vector<int> v(N);

	for(int i = 0; i < N; i++) {
		cin >> v[i];
	}

	cin >> M;

	int a, b;
	// citim "intrebarile"
	// 0 cea mai mare pozitie pe care se afla un elem cu val x sau -1
	// 1 cea mai mare pozitie pe care se afla un elem cu val <= x
	// 2 cea mai mica pozitie pe care se afla un elem cu val >= x
	int result1, result2, result3;
	for(int i = 0; i < M; i++) {
		cin >> a >> x;
		if (a == 0) {
			result1 = CautBin0(x, v, 0, N-1);
		}
		if (a == 1) {
			result2 = CautBin1(x, v, 0, N-1);
		}
		if (a == 2) {
			result3 = CautBin2(x, v, 0, N-1);
		}
	}
	cout << result1 + 1 << endl;
	cout << result2 + 1 << endl;
	cout << result3 + 1<< endl;

	return 0;
}