Cod sursa(job #662000)

Utilizator pykhNeagoe Alexandru pykh Data 15 ianuarie 2012 17:56:35
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
using namespace std;

const char in[]="cautbin.in";
const char out[]="cautbin.out";

const int N = 100005;

int v[N], n, m, op, tar;

int zero(int tar)
	{
		int lo = 1, hi = n, mid, sol = -1;
		
		while(lo <= hi)
		{
			mid = lo + (hi - lo)/2;
		
			//if(v[mid] == tar)return mid;//sol = mid, lo = mid + 1;
			if(v[mid] <= tar) lo = mid + 1;
			else hi = mid - 1;
			
		}
		mid = lo + (hi - lo)/2 ;
		if(v[mid] > tar) --mid;
		if(v[mid] == tar)return mid;
	
		return -1;
}

int unu(int tar)
	{
		int lo = 1, hi = n, mid, sol;
		
		while(lo < hi)
		{
			mid = lo + (hi - lo) / 2;
		
			if(v[mid] <= tar)sol = mid, lo = mid + 1;
			else hi = mid;
		}
		mid = lo + (hi - lo) / 2;
		if(v[mid] > tar)--mid;
		return mid;
}

int doi(int tar)
	{
		int lo = 1, hi = n, mid, sol;
	
		while(lo < hi)
		{
			mid = (lo + (hi - lo) / 2);
	
			if(v[mid] < tar)lo = mid + 1;
			else sol = mid, hi = mid;
		}	
		
		mid = lo + (hi - lo)/2;
		if(v[mid] < tar)++mid;
		
		return mid;
}		
			

int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		
		scanf("%d", &n);
		
		for(int i = 1 ; i <= n ; ++i)
			scanf("%d", &v[i]);
		
		scanf("%d", &m);
		
		for(int i = 1 ; i <= m ; ++i)
		{
			scanf("%d %d", &op, &tar);
			if(!op)printf("%d\n", zero(tar));
			else if(op == 1)printf("%d\n", unu(tar));
			else printf("%d", doi(tar));
		}
		
		return 0;
		
}