Cod sursa(job #942427)

Utilizator ShadoWolfCodrut Constantin Gusoi ShadoWolf Data 22 aprilie 2013 15:32:25
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <limits>
using namespace std;

long v[100001]; 
ifstream in("cautbin.in");
ofstream out("cautbin.out");

long binary_search(long x,long ls,long ld);
long search_exact(long x,long ld);
long search_less(long x,long ld);
long search_greater(long x,long ld);

int main()
{
    long n,a,b,m,c;
	in>>n;
    in.ignore(numeric_limits<streamsize>::max(),'\n');
    for(int i=0;i<n;++i)
    {
        in>>v[i];
    }
	in>>m;
	in.ignore(numeric_limits<streamsize>::max(),'\n');
	for(int i=0;i<m;++i)
    {
        in>>a>>b;
        in.ignore(numeric_limits<streamsize>::max(),'\n');
		switch (a)
		{
			case 0:
				c=search_exact(b,n-1);
				break;
			case 1:
				c=search_greater(b,n-1);
				break;
			case 2:
				c=search_less(b,n-1);
				break;
			default:
				return 0;
		}
		out<<c<<'\n';
    }
    in.close();
    out.close();
    return 0;
}

long binary_search(long x,long ls,long ld)
{

	if (ls>ld) return -1;
	int mid=(ls+ld)/2;
	if (x==v[mid])
		return mid;
	if (x<v[mid])
		return binary_search(x,ls,mid-1);
	return binary_search(x,mid+1,ld);
}

long search_less(long x,long ld)
{
	int poz=binary_search(x,0,ld);
	for(int i=poz-1;i>=0;--i)
		if (v[i]<v[poz]) return i+2;
	return -1;
}

long search_greater(long x,long ld)
{
	int poz=binary_search(x,0,ld);
	for(int i=poz+1;i<=ld;++i)
		if (v[i]>v[poz]) return i;
	return -1;
}

long search_exact(long x,long ld)
{
	int poz=binary_search(x,0,ld);
	if(poz==-1)
		return -1;
	for(int i=poz+1;i<=ld;++i)
		if (v[i]>v[poz]) return i;
	return -1;
}