Cod sursa(job #1753926)

Utilizator bogdanluncasubogdan bogdanluncasu Data 7 septembrie 2016 12:31:13
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<iostream>
#include<math.h>
using namespace std;
int n,m,a[100001];
int greatest(int x){
	int st=0,dr=n-1,mij,poz=-1;
	while(st<=dr){
		mij=(st+dr)>>1;
		if(x==a[mij]){
			poz=mij;st=mij+1;
		}else if(x<a[mij]){
			dr=mij-1;
		}else st=mij+1;;
	}
	return poz;
}
int lowerThanX(int x){
	int st=0,dr=n-1,mij,poz=-1;
	while(st<=dr){
		mij=(st+dr)>>1;
		if(x==a[mij]){
			return greatest(x);
		}else if(x<a[mij]){
			dr=mij-1;
		}else{
			st=mij+1;
			poz=mij;
		}
	}
	return poz;
}
int greaterThanX(int x){
	int st=0,dr=n-1,mij,poz=-1;
	while(st<=dr){
		mij=(st+dr)>>1;
		if(x==a[mij]){
			poz=mij;dr=mij-1;
		}else if(x<a[mij]){
			poz=mij,dr=mij-1;
		}else st=mij+1;;
	}
	return poz;
}
int main(){
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);
	int x,y;
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>x>>y;
		switch(x){
			case 0:cout<<greatest(y)+1<<endl;break;
			case 1:cout<<lowerThanX(y)+1<<endl;break;
			case 2:cout<<greaterThanX(y)+1<<endl;
		}
	}
}