Cod sursa(job #2633684)

Utilizator RaduQQTCucuta Radu RaduQQT Data 8 iulie 2020 11:27:27
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>



int binarySearch0(int v[], int l, int r,int x)
{
	if (l > r)
		return -1;
	if (l == r)
	{
		if (v[l] != x)
			return -1;
		while (v[l] == x)
			l++;
		l--;
		return l;
	}
	int m = (l + r) / 2;
	if (v[m] < x)
		return binarySearch0(v, m + 1, r, x);
	else
		return binarySearch0(v, l, m, x);
}
int binarySearch1(int v[], int l, int r, int x)
{
	if (l==r && v[l] == x)
	{
		while (l >= 1 && v[l] == x)
			l++;
		l--;
		return l;
	}
	if (l >= r)
	{
		while (l >= 1 && v[l] > x)
			l--;
		return l;
	}
	int m = (l + r) / 2;
	if (v[m] < x)
		return binarySearch1(v, m + 1, r, x);
	else
		return binarySearch1(v, l, m, x);
}
int binarySearch2(int v[], int l, int r, int x,int n)
{
	if (l >= r)
	{
		while (l <= n && v[l] < x)
			l++;
		return l;
	}
	int m = (l + r) / 2;
	if (v[m] < x)
		return binarySearch2(v, m + 1, r, x,n);
	else
		return binarySearch2(v, l, m, x,n);
}
int main()
{
	freopen("cautbin.in", "r", stdin);
	//freopen("cautbin.out", "w", stdout);

	int n,v[100010],m;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &v[i]);


	int q, x;
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		scanf("%d%d", &q, &x);
		if (q == 0)
		{
			printf("%d\n", binarySearch0(v, 1, n, x));
		}
		if (q == 1)
		{
			printf("%d\n", binarySearch1(v, 1, n, x));
		}
		if (q == 2)
		{
			printf("%d\n", binarySearch2(v, 1, n, x,n));
		}
	}
}