Cod sursa(job #1753935)

Utilizator bogdanluncasubogdan bogdanluncasu Data 7 septembrie 2016 12:39:36
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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=-2;
	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=-2;
	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=-2;
	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;
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		scanf("%d %d",&x,&y);
		switch(x){
			case 0:printf("%d\n",greatest(y)+1);break;
			case 1:printf("%d\n",lowerThanX(y)+1);break;
			case 2:printf("%d\n",greaterThanX(y)+1);
		}
	}
}