Cod sursa(job #964450)

Utilizator alexbangauBangau Marian Alexandru alexbangau Data 20 iunie 2013 23:33:00
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<iostream>
#include<fstream>
using namespace std; 
long int n, x[100001], val1, m, res;
void caut_bin0(long int val)
{
long int st=1;
long int dr=n;
long int poz=-1;
while(st<=dr)
	{long int mij;
	mij=st+(dr-st)/2;
	if(val<x[mij])
		dr=mij-1;
	else
		st=mij+1;
	if(x[mij]==val)
	{poz=mij;break;}
	}
if(poz!=-1)
	{
		long int j=poz;
		while(x[j]==val)
			j++;
		poz=j-1;
	}
res=poz;
}

void caut_bin1(long int val)
{
long int st=1;
long int dr=n;
long int poz=-1;
while(st<=dr)
	{long int mij;
	mij=st+(dr-st)/2;
	if(val<x[mij])
		dr=mij-1;
	else
		st=mij+1;
	if(x[mij]==val)
	{poz=mij;break;}
	}
if(poz!=-1)
	{
		long int j=poz;
		while(x[j]==val)
			j++;
		poz=j-1;
	}
else
	poz=st-1;
res=poz;
}

void caut_bin2(long int val)
{
long int st=1;
long int dr=n;
long int poz=-1;
while(st<=dr)
	{long int mij;
	mij=st+(dr-st)/2;
	if(val<x[mij])
		dr=mij-1;
	else
		st=mij+1;
	if(x[mij]==val)
	{poz=mij;break;}
	}
if(poz!=-1)
	{
		long int j=poz;
		while(x[j]==val)
			j--;
		poz=j+1;
	}
else
	poz=st+1;

res=poz;
}

int main(){
	ifstream f1("cautbin.in");
	f1>>n;
	for(long int i=1; i<=n; i++)
		f1>>x[i];
	int poz;
	f1>>m;
	ofstream f2("cautbin.out");
	for(long int i=1; i<=m; i++)
		{long int cond1;
		res=0;
		f1>>cond1;
		f1>>val1;
		if(cond1==0)
			caut_bin0(val1);
		if(cond1==1)
			caut_bin1(val1);
		if(cond1==2)
			caut_bin2(val1);
		f2<<res<<endl;
		}
	f1.close();	
	f2.close();
	return 0;
}