Cod sursa(job #268974)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 2 martie 2009 09:06:59
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

#define MAXN 100001

int n, v[MAXN];

void citeste_vector()
{
	scanf("%d", &n);
	for(int i=1; i<=n; ++i) scanf("%d", v+i);	
}

int cb(int x)
{
	int li = 1, ls = n, mij;
	while(ls > li)
	{
		mij = li + (ls - li) / 2;
		if(v[mij] == x) break;
		if(v[mij] > x) ls = mij - 1;
		else li = mij + 1;
	}
	return li;
}

void r0(int x)
{
	int li = cb(x);
	while(v[li] == x) ++li;
	if(v[li-1] == x) printf("%d\n", li-1);
	else printf("-1\n");
}


void r1(int x)
{
	int ind = cb(x) + 2;
	while(v[ind] > x) ind--;
	printf("%d\n", ind);
}

void r2(int x)
{
	int ind = cb(x) - 2;
	while(v[ind] < x) ind++;
	printf("%d\n", ind);
}

int main()
{
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);
	citeste_vector();
	int teste, operatie, x;
	scanf("%d", &teste);
	for(;teste;--teste)
	{
		scanf("%d%d", &operatie, &x);
		switch(operatie)
		{
			case 0:
				r0(x);
				break;
			case 1:
				r1(x);
				break;
			case 2:
				r2(x);
				break;
		}
	}
	
	fclose(stdin);
	return 0;
}