Cod sursa(job #1329611)

Utilizator danut.avadaneiDanut Avadanei danut.avadanei Data 29 ianuarie 2015 18:25:21
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
FILE *in, *out;

long int getInt()
{
	long int a;
	fscanf(in,"%lu",&a);
	return a;
}
void init()
{
	in = fopen("cautbin.in","r");
	out = fopen("cautbin.out","w");
}
long int cautBin(long int *vec, long int len, long int x)
{
	long int mid, st, dr;
	st = 0;
	dr = len;
	do
	{
		mid = (st + dr)/2;
		if(vec[mid] == x)
		{
			return mid; 
		}
		else
		{
			if(vec[mid] > x)
			{
				dr = mid - 1;
			}
			else
			{
				st = mid + 1;
			}
		}
	}while(st <= dr);
	return -dr;
}
long int mare(long int *vec, long int x, long int pos)
{
	while(1)
	{
		if(vec[pos+1] == x)
			pos++;
		else 
			return pos;
	}
}
long int mic(long int *vec, long int x, long int pos)
{
	while(1)
	{
		if(vec[pos-1] == x)
			pos--;
		else 
			return pos;
	}
}
int main()
{
	init();
	
	long int vec[100001],i,n,m,x,tmp;
	n = getInt();
	for(i = 0;i < n;i++)
		vec[i] = getInt();
	m = getInt();
	for(i = 0; i < m;i++)
	{
		switch(getInt())
		{
		case 0:
			x = getInt();
			tmp = cautBin(vec,n,x);
			if(tmp >= 0)
				fprintf(out,"%lu\n",mare(vec,x,tmp) + 1);
			else
				fprintf(out,"-1");
			break;
		case 1:
			x = getInt();
			tmp = cautBin(vec,n,x);
			if(tmp >= 0)
				fprintf(out,"%lu\n",mare(vec,x,tmp) + 1);
			else
				fprintf(out,"%lu\n",-tmp + 1);
			break;
		case 2:
			x = getInt();
			tmp = cautBin(vec,n,x);
			if(tmp >= 0)
				fprintf(out,"%lu\n",mic(vec,x,tmp) + 1);
			else
				fprintf(out,"%lu\n",-tmp + 2);
			break;
		default : fprintf(out,"-1\n");
		}
	}
	return 0;
}