Cod sursa(job #2448550)

Utilizator hellhereHell here hellhere Data 17 august 2019 12:26:58
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
# pragma GCC optimize("Ofast")
# pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define forn(i,a,b) for (int i = a; i <= b; i++)
#define fi(i,a,b) for (int i = a; i < b; i++)
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define rc(s) return cout<<s,0
#define er erase
#define in insert
#define pi pair <int, int>
#define pii pair <pi, pi>
# define sz(x) (int)((x).size())

int a[100005],n,m,x,y;
int bs0(int l, int r,int val){
	int ans=-1;
	while(r-l>=1){
	
		int mid=(l+r)/2;
		if(a[mid]==val)l=mid+1,r=n,ans=mid;else
		if(a[mid]<val)l=mid+1;else r=mid-1;
	}
	return ans;	
}
int bs1(int l, int r,int val){
	int ans=0;
	while(r-l>=1){
		int mid=(l+r)/2;
		if(a[mid]<=val && a[mid+1]>val)ans=mid,l=r;else
		if(a[mid]>=val)l=mid;else r=mid;
	}
	return ans;
}
int bs2(int l,int r,int val){
	int ans=0;
	while(r-l>=1){
		int mid=(r+l)/2;
		if(a[mid]>=val && a[mid-1]<val)ans=mid,l=r;else
		if(a[mid]>=val)r=mid;else l=mid;
	}
	return ans;
}

int32_t main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	ifstream cin("cautbin.in");
	ofstream cout("cautbin.out");
	cin>>n;
	forn(i,1,n)cin>>a[i];
	cin>>m;
	forn(k,1,m){
		cin>>x>>y;
		if(x==0)cout<<bs0(1,n,y)<<'\n';else
		if(x==1)cout<<bs1(1,n,y)<<'\n';else
		if(x==2)cout<<bs2(1,n,y)<<'\n';	
	}
return 0;
}