Cod sursa(job #659437)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 10 ianuarie 2012 17:14:22
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<iostream>
#include<fstream>
using namespace std;
int v[100001];
int cautarebinara(int p, int q, int x)
{
	int mij,poz;
	poz=-1;
	while(p<=q) {
		mij=(p+q)/2;
		if(x<v[mij])
			q=mij-1;
		else if(x>v[mij])
			p=mij+1;
		else {
			poz=mij;
			break;
		}
	}
	if(poz>0)
		while(v[poz]==v[poz+1])
			poz++;
	return poz;
}
int cautarebinara1(int p, int q, int x)
{
	int mij,poz;
	poz=-1;
	while(p<=q) {
		mij=(p+q)/2;
		if(x<v[mij])
			q=mij-1;
		else if(x>v[mij]) {
			poz=mij;
			p=mij+1;
		}
		else {
			poz=mij;
			break;
		}
	}
	if(poz<=0)
		return poz;
	while(v[poz]==v[poz+1])
		poz++;
	return poz;
}
int cautarebinara2(int p, int q, int x)
{
	int mij,poz;
	poz=-1;
	while(p<=q) {
		mij=(p+q)/2;
		if(x<v[mij]) {
			poz=mij;
			q=mij-1;
		}
		else if(x>v[mij]) 
			p=mij+1;
		else {
			poz=mij;
			break;
		}
	}
	if(poz<=0)
		return poz;
	while(v[poz]==v[poz-1])
		poz--;
	return poz;
}

int main ()
{
	int n,m,i,op,x;
	ifstream f("cautbin.in");
	ofstream g("cautbin.out");
	f>>n;
	for(i=1;i<=n;i++)
		f>>v[i];
	f>>m;
	for(i=1;i<=m;i++) {
		f>>op>>x;
		if(op==0)
			g<<cautarebinara(1,n,x)<<'\n';
		else if(op==1)
			g<<cautarebinara1(1,n,x)<<'\n';
		else g<<cautarebinara2(1,n,x)<<'\n';
	}
	f.close();
	g.close();
	return 0;
}