Cod sursa(job #460575)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 3 iunie 2010 10:32:48
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
using namespace std;

int v[100001];
int m, n, i, j;
int nr, val;

int cauta0 (int x)
{
	int st, dr, mijl;
	st = 1;
	dr = n;
	while (st <= dr)
	{
		mijl = (st + dr) / 2;
		if (x == v[mijl])
		{
			while (x == v[mijl])
				mijl ++;
			mijl --;
			return mijl;
		}
		else if (x > v[mijl])
			st = mijl + 1;
		else if (x < v[mijl])
			dr = mijl - 1;
	}
	return -1;
}

int cauta2 (int x)
{
	int st, dr, mijl;
	st = 1;
	dr = n;
	while (st <= dr)
	{
		mijl = (st + dr) / 2;
		if (v[mijl] == x)
		{
			while (v[mijl] == x)
				mijl --;
			mijl ++;
			return mijl;
		}
		else if (x > v[mijl])
			st = mijl + 1;
		else if (x < v[mijl])
			dr = mijl - 1;
	}
	return -1;
}

int main ()
{
	FILE *f = fopen ("cautbin.in","r");
	FILE *g = fopen ("cautbin.out","w");
	fscanf (f,"%d", &n);
	for (i=1; i<=n; ++i)
		fscanf (f,"%d", &v[i]);
	fscanf (f,"%d", &m);
	
	for (i=1; i<=m; ++i)
	{
		fscanf (f,"%d %d", &val, &nr);
		if (val == 0)
			fprintf (g,"%d\n", cauta0 (nr));
		else if (val == 1)
		{
			while (cauta0(nr) == -1)
				nr --;
			fprintf (g,"%d\n", cauta0(nr));
		}
		else if (val == 2)
		{
			while (cauta2(nr) == -2)
				nr ++;
			fprintf (g,"%d\n", cauta2(nr));
		}	
	}
	
	fclose(g);
	fclose(f);
	return 0;
}