Cod sursa(job #324612)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 16 iunie 2009 16:27:05
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
int n;
int v[100002];

void read()
{
	freopen("cautbin.in","r",stdin);
	freopen("cautbin.out","w",stdout);
	scanf("%d",&n);
	int i;
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
}

int cautare0(int x)
{
	int st=1,dr=n,m;
	while(st!=dr)
	{
		m=(st+dr)>>1;
		if(v[m]<=x)
			st=m+1;
		else
			dr=m;
	}
	while(v[st]>x)
		st--;
	while(v[st]<=x)
		st++;
	if(v[st-1]!=x)
		return -1;
	return st-1;
}

int cautare1(int x)
{
	int st=1,dr=n,m;
	while(st!=dr)
	{
		m=(st+dr)>>1;
		if(v[m]<=x)
			st=m+1;
		else
			dr=m;
	}
	while(v[st]<=x)
		st++;
	while(v[st]>x)
		st--;
	return st;
}

int cautare2(int x)
{
	int st=1,dr=n,m;
	while(st!=dr)
	{
		m=(st+dr)>>1;
		if(v[m]>=x)
			dr=m;
		else
			st=m+1;
	}
	while(v[st]>=x)
		st--;
	while(v[st]<x)
		st++;
	return st;
}

void rez()
{
	int t,vx,x;
	scanf("%d",&t);
	for(;t;t--)
	{
		scanf("%d%d",&x,&vx);
		if(x==0)
			printf("%d\n",cautare0(vx));
		if(x==1)
			printf("%d\n",cautare1(vx));
		if(x==2)
			printf("%d\n",cautare2(vx));
	}
}

int main()
{
	read();
	sort(v+1,v+n+1);
	rez();
	return 0;
}