Cod sursa(job #2542641)

Utilizator radustn92Radu Stancu radustn92 Data 10 februarie 2020 13:10:45
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <vector>
using namespace std;

const int NMAX = 100505;

int N, M, arr[NMAX];

int largestLte(int x) {
	if (arr[1] > x) {
		return 0;
	}

	// arr[left] <= x < arr[right]
	int left = 1, right = N + 1, mid;

	while (right - left > 1) {
		mid = left + (right - left) / 2;
		if (arr[mid] > x) {
			right = mid;
		} else {
			left = mid;
		}
	}

	return left;
}

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

	scanf("%d", &N);
	for (int i = 1; i <= N; i++) {
		scanf("%d", &arr[i]);
	}
	scanf("%d", &M);

	int queryType, x;
	for (int queryNo = 0; queryNo < M; queryNo++) {
		scanf("%d%d", &queryType, &x);
		switch(queryType) {
			case 0: {
				int posLte = largestLte(x);
				if (posLte >= 1 && arr[posLte] == x){
					printf("%d\n", posLte);
				} else {
					printf("-1\n");
				}
				break;
			}
			case 1: {
				printf("%d\n", largestLte(x));
				break;
			}
			case 2: {
				int posLte = largestLte(x - 1);
				if (posLte == 0 || arr[posLte] < x) {
					posLte++;
				}
				printf("%d\n", posLte);
				break;
			}
		}
	}
	return 0;
}