Cod sursa(job #1021914)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 4 noiembrie 2013 14:37:38
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;
#define NMax 100001
#define MMax 10000
int v[NMax], poz, caz;
int caut0 (int li, int ls, int x)
{
	int m = (li + ls) / 2;
	if (v[m] == x)
	{
		return m;
	}
	else
	{
		if (li < ls)
		{
			if ( x < v[m] )
			{
				caut0(li, m-1, x);
			}
			else
				caut0(li, m-1, x);
		}
		else
		{
			if ( caz == 0 ) 
				return -1;
			if ( caz == 1 )
				return li;
			if ( caz == 2 )
				return ls;
		}
	}
}
int main()
{
	int n, m;
	FILE *f = fopen("cautbin.in", "r");
	FILE *g = fopen("cautbin.out", "w");
	fscanf(f, "%d", &n);
	for (int i = 0; i < n; i++)
		fscanf(f, "%d", &v[i]);
	fscanf(f, "%d", &m);
	int val;
	for (int i = 0; i < m; i++)
	{
		fscanf(f, "%d %d", &caz, &val);
		poz = 0;
		if (caz == 0)
		{
			int poz = caut0 (0, n-1, val);
			while (v[poz+1] == val && poz+1 < n)
				poz++;
			fprintf(g, "%d\n", poz+1);
		}
		else
			if (caz == 1)
			{
				int poz = caut0 (0, n-1, val);
				while (v[poz+1] <= val && poz+1 < n)
					poz++;
				fprintf(g, "%d\n", poz+1);
			}
			else
				if (caz == 2)
				{
					int poz = caut0 (0, n-1, val);
					while ( v[poz-1] >= val && poz-1 >= 0)
						poz--;
					fprintf(g, "%d\n", poz+1);
				}
	}
	fclose(f);
	fclose(g);
	return 0;
}